Respostas:
O "|" também precisa de uma barra invertida para obter seu significado especial.
echo "blia blib bou blf" | sed 's/bl\(ia\|f\)//g'
vai fazer o que quiser.
Como você sabe, se tudo mais falhar, leia o manual :-).
Manual do usuário do GNU sed , seção 3.3 Visão geral da sintaxe da expressão regular :
`REGEXP1 \ | REGEXP2 '
Corresponde a REGEXP1 ou a REGEXP2.
Observe a barra invertida ...
Infelizmente, a sintaxe de regex não é realmente padronizada ... há muitas variantes, que diferem entre outras coisas nas quais "caracteres especiais" precisam \ e quais não. Em alguns, é até mesmo configurável ou depende de switches (como no GNU grep
, que você pode alternar entre três diferentes dialetos regex).
Esta resposta em particular é para o GNU sed . Existem outras sed
variantes, por exemplo, a usada nos BSDs, que se comportam de maneira diferente.
sed
suporta alternância, mas apenas com a sintaxe regex "estendida" ( -E
) - o que significa que não há barras invertidas nos tubos ou nos parênteses:echo "blia blib bou blf" | sed -E 's/bl(ia|f)//g'
Já que existem vários comentários sobre sed
implementações não-Gnu : Pelo menos no OS X, você pode usar o -E
argumento para sed
:
Interpretar expressões regulares como expressões regulares estendidas (modernas) em vez de expressões regulares básicas (BREs). A página de manual re_format (7) descreve os dois formatos.
Então você pode usar metacaracteres de expressões regulares sem escapar deles. Exemplo:
$ echo "blia blib bou blf" | sed -E 's/bl(ia|f)//g'
blib bou
O GNU sed também suporta a -r
opção (expressões regulares estendidas). Isso significa que você não precisa escapar dos metacaracteres:
echo foohello barhello | sed -re "s/(foo|bar)hello/hi/g"
Saída:
hi hi
-r
opção é realmente muito útil para a legibilidade das expressões. Essa deveria ser a resposta aceita.
O \|
não funciona com sed no Solaris 10 também. O que eu fiz foi usar
perl -p -e 's/bl(ia|f)//g'
Acompanhamento: sed -E permite no MacOS. Não há necessidade de backslash para |.
sed -E 's/this|orthat/oooo/g' infile