uso de alternância “|” no regex de sed

69

Estou usando o sed, versão GNU sed 4.2.1. Eu quero usar a alternância "|" símbolo em uma subexpressão. Por exemplo:

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

deve retornar

" blib bou "

mas retorna

"blia blib bou blf".

Como posso ter o resultado esperado?

    
por Cedric 22.02.2010 / 15:31

6 respostas

101

O "|" também precisa de uma barra invertida para obter seu significado especial.

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

fará o que você 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 do Regular Sintaxe de Expressão :

'REGEXP1\|REGEXP2'

Matches either REGEXP1 or REGEXP2.

Observe a barra invertida ...

Infelizmente, a sintaxe regex não é realmente padronizada ... existem 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 variantes de sed , por exemplo, a usada nos BSDs, que se comportam de maneira diferente.

    
por 22.02.2010 / 15:36
17

Como existem vários comentários sobre implementações não-Gnu sed : Pelo menos no OS X, você pode usar o argumento -E para sed :

Interpret regular expressions as extended (modern) regular expressions rather than basic regular expressions (BRE's). The re_format(7) manual page fully describes both formats.

Depois, você pode usar os metacaracteres de expressões regulares sem evitá-los. Exemplo:

$ echo "blia blib bou blf" | sed -E 's/bl(ia|f)//g'
 blib bou 
    
por 28.05.2013 / 20:56
9

O \| também não funciona com o sed no Solaris 10. O que eu fiz foi usar

perl -p -e 's/bl(ia|f)//g'
    
por 28.05.2013 / 19:42
9

O GNU sed também suporta a opção -r (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
    
por 18.02.2014 / 10:03
4

Acompanhamento: sed -E permite no MacOS. Não há necessidade de backslash para |.

 sed -E 's/this|orthat/oooo/g' infile
    
por 28.08.2013 / 22:15
1

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.

    
por 18.02.2016 / 05:19

Tags