Sed поиск заменить шаблон (Bash) - PullRequest
1 голос
/ 01 мая 2011

Вот пример текста, который я использую с sed (в bash, centos).Я разбил текст на строки, чтобы было легче читать. Но текст ниже обычно весь в одну строку.

некоторый текст (Abc_3.7 | AUTODETECT | "} {\ fldrslt \ plain \ f2\ fs20 \ cf2 3: 7}} \ plain \ f2 \ fs20

Xyz_3.16 | AUTODETECT | "} {\ fldrslt \ plain \ f2 \ fs20 \ cf2 16}} \обычный \ f2 \ fs20 текст,

Qr_3.11 | AUTODETECT | "} {\ fldrslt \ plain \ f2 \ fs20 \ cf2 11}} \ plain \ f2 \ fs20 что-то

Я хочу удалить из каждой записи: | AUTODETECT | "} {\ fldrslt \ plain \ f2 \ fs20 \ cf2 3: 7}}

Текст между \ plain и}} будет различаться, поэтому мне нужно выбрать все.

Вот код, который я сейчас использую:

s/|AUTODETECT|\"}{\\fldrslt \\plain .*}}/ /g;

Проблема. Я ожидаю результаты будут:

Abc_3.7 \plain \f2\fs20 Xyz_3.16 \plain \f2\fs20 more text, Qr_3.11 \plain \f2\fs20 something

Но фактические результаты :

Abc_3.7 \plain \f2\fs20

1 Ответ

1 голос
/ 01 мая 2011

.* является жадным и соответствует всему, начиная с первых данных после «простого» и заканчивая последней парой закрывающих фигурных скобок, включая другие автоопределения и т. Д. Вам нужен более тонкий (менее жадный) шаблон:

sed 's/|AUTODETECT|"}{\\fldrslt \\plain [^}]*}}/ /g' "$@"

Часть '[^}]*' соответствует произвольной последовательности чего угодно, кроме '}' (и новой строки).


Если сценарий должен находиться в файле, тогдаФайл сценария sed содержит:

s/|AUTODETECT|"}{\\fldrslt \\plain [^}]*}}/ /g

, и вызов становится следующим:

sed -f sed.script "$@"

В основном все, кроме одинарных кавычек, попадает в файл сценария.Одним из преимуществ использования одинарных кавычек является то, что с побегами меньше беспокоиться.Проблемы возникают только тогда, когда скрипт должен содержать одинарные кавычки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...