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.