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?


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/


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

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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.