Ответы:
"|" также нужен обратный слеш, чтобы получить его особое значение.
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, которые ведут себя по-разному.
sed
поддерживает чередование, но только с «расширенным» синтаксисом регулярных выражений ( -E
) - что означает отсутствие обратной косой черты ни в каналах, ни в скобках:echo "blia blib bou blf" | sed -E 's/bl(ia|f)//g'
Поскольку есть несколько комментариев относительно реализаций не-Gnu sed
: По крайней мере, в OS X вы можете использовать -E
аргумент для sed
:
Регулярные выражения интерпретировать как расширенные (современные) регулярные выражения, а не как базовые регулярные выражения (BRE). Страница справочника re_format (7) полностью описывает оба формата.
Затем вы можете использовать метасимволы регулярных выражений, не экранируя их. Пример:
$ echo "blia blib bou blf" | sed -E 's/bl(ia|f)//g'
blib bou
GNU sed также поддерживает эту -r
опцию (расширенные регулярные выражения). Это означает, что вам не нужно избегать метасимволов:
echo foohello barhello | sed -re "s/(foo|bar)hello/hi/g"
Выход:
hi hi
-r
опция действительно очень полезна для удобства чтения выражений. Это должен быть принятый ответ.
Также \|
не работает с sed на Solaris 10. То, что я сделал, было использовать
perl -p -e 's/bl(ia|f)//g'
Продолжение: sed -E позволяет это на MacOS. Никакой обратной косой черты не требуется для |.
sed -E 's/this|orthat/oooo/g' infile