73

Я использую sed, GNU sed версия 4.2.1. Я хочу использовать чередование "|" символ в подвыражении. Например :

echo "blia blib bou blf" | sed 's/bl\(ia|f\)//g'

должен вернуться

" blib bou "

но возвращается

"blia blib bou blf".

Как я могу получить ожидаемый результат?

6 ответов6

105

"|" также нужен обратный слеш, чтобы получить его особое значение.

echo "blia blib bou blf" | sed 's/bl\(ia\|f\)//g'

будет делать то, что вы хотите.

Как вы знаете, если ничего не помогает, прочитайте руководство :-).

Руководство пользователя GNU sed, раздел 3.3 Обзор синтаксиса регулярных выражений:

`REGEXP1\| REGEXP2'

Совпадает с REGEXP1 или REGEXP2.

Обратите внимание на обратную косую черту ...

К сожалению, синтаксис регулярных выражений на самом деле не стандартизирован ... существует много вариантов, которые отличаются между прочим, в которых "специальные символы" нужны \, а какие нет. В некоторых это даже настраивается или зависит от переключателей (как в GNU grep , который вы можете переключать между тремя различными диалектами регулярных выражений).

Этот ответ, в частности, для GNU sed. Существуют и другие варианты sed , например, используемый в BSD, которые ведут себя по-разному.

19

Поскольку есть несколько комментариев относительно не-Gnu sed реализаций: По крайней мере, в OS X вы можете использовать аргумент -E для sed:

Регулярные выражения интерпретировать как расширенные (современные) регулярные выражения, а не как базовые регулярные выражения (BRE). Страница справочника re_format (7) полностью описывает оба формата.

Затем вы можете использовать метасимволы регулярных выражений, не экранируя их. Пример:

$ echo "blia blib bou blf" | sed -E 's/bl(ia|f)//g'
 blib bou 
10

GNU sed также поддерживает опцию -r (расширенные регулярные выражения). Это означает, что вам не нужно избегать метасимволов:

echo foohello barhello | sed -re "s/(foo|bar)hello/hi/g"

Выход:

hi hi
9

\| также не работает с sed на Solaris 10. То, что я сделал, было использовать

perl -p -e 's/bl(ia|f)//g'
4

Продолжение: sed -E позволяет это на MacOS. Никакой обратной косой черты не требуется для |.

 sed -E 's/this|orthat/oooo/g' infile
1

В GnuWin32 в Windows sed синтаксис sed "s/thing1\|thing2/ /g" source > destination .

Кавычки должны иметь тип " - это" Обязательно "для разбора команды.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .