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 -ropção. No FreeBSD ou OSX , passe a -Eopçã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