Por que o sed não substitui todas as ocorrências?

118

Se eu executar este código no bash:

echo dog dog dos | sed -r 's:dog:log:'

dá saída:

log dog dos

Como posso fazer com que ele substitua todas as ocorrências de cão?

Nishant George Agrwal
fonte
2
Você precisa do gsinalizador para substituição global, você também não precisa da -ropção aqui.
Chris Seymour

Respostas:

188

Você deve adicionar o gmodificador para que o sed execute uma substituição global do conteúdo do buffer de padrão:

echo dog dog dos | sed -e 's:dog:log:g'

Para obter uma documentação fantástica sobre o sed, visite http://www.grymoire.com/Unix/Sed.html . Este sinalizador global é explicado aqui: http://www.grymoire.com/Unix/Sed.html#uh-6

A documentação oficial do GNU sedestá disponível em http://www.gnu.org/software/sed/manual/

Bruno reis
fonte
1
Adicionando um caso secundário para GNU sed aqui: sed -E 's,foo,bar,g'não faz a coisa global. Se você mudar para sed -E -e 's,foo,bar,g'ele funciona.
Melvyn Sopacua
23

Você tem que colocar um gno final, ele significa "global":

echo dog dog dos | sed -r 's:dog:log:g'
                                     ^
Alestanis
fonte
1
sed -e deve ser usado em vez de sed -r, que não existe.
Dylan Daniels
1
@DylanDaniels De acordo com man sedno Ubuntu, a -ropção significa "usar expressões regulares estendidas". Portanto, o comando fornecido funciona bem, embora não precise dos recursos de expressões regulares estendidas para funcionar.
Craig McQueen