Existem muitas variações na sintaxe da expressão regular . As primeiras ferramentas no mundo unix que tinham expressões regulares não tinham todos os recursos de expressões regulares, apenas conjuntos de caracteres ( […]
e .
), repetição ( *
) e âncoras de linha ( ^
e $
). Expressões regulares básicas possuem apenas esses operadores. Sed é uma ferramenta da velha escola e usa regexps básicos.
Muitas implementações sed possuem extensões para correspondência completa de regexp. Como o personagem |
se destaca, você precisa usá-lo \|
para alternar, da mesma forma \(
e \)
para agrupar. Note que o padrão POSIX não exige \|
suporte a expressões regulares básicas , e alguns sistemas (por exemplo, OpenBSD ) não o possuem.
Algumas versões do sed têm a opção de alternar para expressões regulares estendidas , onde (…)
é usado para agrupamento e |
alternância. Com o GNU sed (ou seja, no Linux ou Cygwin) ou Busybox , passe a -r
opção. No FreeBSD ou OSX , passe a -E
opção
Se o seu sed não tiver alternância, você pode ligar awk
. É mandatado pelo POSIX , mas é um pouco detalhado para esta tarefa, e não suporta referências posteriores.
awk '{gsub(/foo|bar/, "narf")}' <fileName.old >fileName.new
A propósito, apenas o GNU e o Busybox sed suportam a substituição de arquivos. Awk e outras versões do sed não. Consulte Posso fazer o `cut` alterar um arquivo no lugar?
Se você possui o Perl, geralmente é útil de uma maneira que faz uma ferramenta única para o processamento de textos de uma linha. A maior parte do que é fácil em sed, awk e o resto não é muito mais difícil no Perl, e você pode aprender uma única ferramenta (se complexa).
perl -i -pe 's/foo|bar/narf/g' fileName