Pourquoi sed ne remplace-t-il pas toutes les occurrences?

118

Si j'exécute ce code dans bash:

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

il donne la sortie:

log dog dos

Comment puis-je le faire remplacer toutes les occurrences de chien?

Nishant George Agrwal
la source
2
Vous avez besoin de l' gindicateur pour la substitution globale, vous n'avez pas non plus besoin de l' -roption ici.
Chris Seymour

Réponses:

188

Vous devez ajouter le gmodificateur pour que sed effectue une substitution globale du contenu du tampon de motif:

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

Pour une documentation fantastique sur sed, consultez http://www.grymoire.com/Unix/Sed.html . Ce drapeau global est expliqué ici: http://www.grymoire.com/Unix/Sed.html#uh-6

La documentation officielle de GNU sedest disponible sur http://www.gnu.org/software/sed/manual/

Bruno Reis
la source
1
Ajouter un cas de coin pour GNU sed ici: sed -E 's,foo,bar,g'ne fait pas la chose globale. Si vous le changez, sed -E -e 's,foo,bar,g'cela fonctionne.
Melvyn Sopacua
23

Il faut mettre un gà la fin, ça veut dire "global":

echo dog dog dos | sed -r 's:dog:log:g'
                                     ^
alestanis
la source
1
sed -e doit être utilisé à la place de sed -r, qui n'existe pas.
Dylan Daniels
1
@DylanDaniels Selon man sedUbuntu, l' -roption signifie "utiliser des expressions régulières étendues". Ainsi, la commande donnée fonctionne correctement, même si elle n'a pas besoin des fonctionnalités des expressions régulières étendues pour fonctionner.
Craig McQueen