Use a opção -r para sintaxe estendida de regexp:
sed -r -e 's/foo|bar/narf/g'
Caso contrário, escape da disjunção como \| :
sed -e 's/foo\|bar/narf/g'
Suponha que você tenha um arquivo de texto:
foo fnord bar
bizz foo poit
E agora eu gostaria de substituir "foo" e "bar" em "narf".
Eu sei que posso usar:
sed -e 's/foo/narf/g' -e 's/bar/narf/g' fileName
No entanto, gostaria de trabalhar com um operador OR que diga ao regex para combinar as duas agulhas por meio de uma expressão.
Acertando alguns manuais, suponho que o pipe deve atender às minhas necessidades, mas tentei
sed -e 's/foo|bar/narf/g' -i fileName
e não funcionou e nem sequer está a gerar um erro.
O que estou fazendo de errado aqui?
Existem muitas variações na sintaxe 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% código%). Expressões regulares básicas só têm esses operadores. Sed é uma ferramenta antiga e usa regexps básicos.
Muitas implementações de sed têm extensões para correspondência completa de regexp. Como o caractere $ significa ele mesmo, você precisa usar | para alternação e, da mesma forma, \| e \( para agrupamento. Note que o padrão POSIX não exige que \) seja suportado em expressões regulares básicas e alguns sistemas (por exemplo, OpenBSD ) não tem isso.
Algumas versões do sed têm a opção de alternar para expressões regulares estendidas , em que \| é usado para agrupamento e (…) para alternação. Com o GNU sed (por exemplo, no Linux ou no Cygwin) ou no Busybox , passe a opção | . Em FreeBSD ou OSX , passe a opção -r .
Se o seu sed não tiver alternância, você pode chamar -E . Ele é obrigatório por POSIX , mas um pouco detalhado para essa tarefa, e não suporta referências anteriores.
awk '{gsub(/foo|bar/, "narf")}' <fileName.old >fileName.new
A propósito, somente o GNU e o Busybox sed suportam a substituição de arquivos no lugar. Awk e outras versões do sed não. Veja Posso fazer 'cortar' alterar um arquivo no lugar
Se você tem Perl, muitas vezes é útil em um one-tool-does-all-way para processamento de texto one-liners. A maior parte do que é fácil em sed, awk e o resto não é muito mais difícil em Perl, e você pode aprender uma única ferramenta (se complexa).
perl -i -pe 's/foo|bar/narf/g' fileName
Você pode usar o Vim no modo Ex:
ex -sc '%s/\vPA|QU/RO/g|x' file
% seleciona todas as linhas
s substituto
\v ativa a mágica
g global replace
x salvar e fechar