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?


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/


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'
                                     ^

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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.