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 parased
:Então você pode usar metacaracteres de expressões regulares sem escapar deles. Exemplo:
fonte
O GNU sed também suporta a
-r
opção (expressões regulares estendidas). Isso significa que você não precisa escapar dos metacaracteres:Saída:
fonte
-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 usarfonte
Acompanhamento: sed -E permite no MacOS. Não há necessidade de backslash para |.
fonte
No GnuWin32 no Windows sed a sintaxe é
sed "s/thing1\|thing2/ /g" source > destination
.As aspas devem digitar
"
- isso é "Obrigatório" para o comando ser analisado.fonte