Rechercher et remplacer du texte dans un fichier à l'aide de la commande sed
La procédure pour changer le texte dans les fichiers sous Linux/Unix en utilisant sed :
- Utilisez Stream EDitor (sed) comme suit :
- NULLsed -i s/old-text/new-text/g input.txt
- Le site s est la commande de substitution de sed pour rechercher et remplacer
- Il demande à sed de trouver toutes les occurrences de 'old-text' et de les remplacer par 'new-text' dans un fichier nommé input.txt.
- Vérifier que le fichier a été mis à jour :
- NULLplus input.txt
Voyons la syntaxe et l'utilisation en détail.
Niveau de difficulté | Facile |
Privilèges de la racine | Non |
Exigences | Terminal Linux ou Unix |
Catégorie | Scripting shell Linux |
Conditions préalables | Utilitaire sed |
Compatibilité avec les systèmes d'exploitation | BSD-Linux-macOS-Unix-WSL |
Temps de lecture estimé | 4 minutes |
Syntaxe : sed trouver et remplacer du texte
La syntaxe est la suivante :
$ sed s/word1/word2/g input.file
## *BSD/macOS sed syntax ##
$ sed s/word1/word2/g input.file >$ sed s/word1/word2/g input.file > output.file
## GNU/Linux sed syntax ##
$ sed -i s/word1/word2/g input.file
$ sed -i -e s/word1/word2/g -e s/xx/yy/g input.file
## Use + separator instead of / ##
$ sed -i s+regex+new-text+g file.txt
Ce qui précède remplace toutes les occurrences des caractères du mot 1 dans l'espace des motifs par les caractères correspondants du mot 2.
Exemples qui utilisent sed pour rechercher et remplacer
Créons un fichier texte appelé hello.txt comme suit :
$ cat hello.txt
Un exemple de fichier :
The is a test file created by nixCrft for demo purpose. foo is good. Foo is nice. I love FOO.
Je vais utiliser s/ pour remplacer l'expression trouvée foo par bar comme suit :
$ sed s/foo/bar/g hello.txt
Exemples de résultats :
The is a test file created by nixCrft for demo purpose. bar is good. Foo is nice. I love FOO.
Pour mettre à jour le fichier, passez la commande -i lorsque vous utilisez la version GNU/sed :
$ sed -i s/foo/bar/g hello.txt
$ cat hello.txt
Le site g/ signifie remplacement global, c'est-à-dire trouver toutes les occurrences de foo et les remplacer par bar en utilisant sed. Si vous supprimez le /g, seule la première occurrence est modifiée. Par exemple :
$ sed -i s/foo/bar/ hello.txt
Le site / agissent comme des caractères de délimitation. Pour correspondre à tous les cas de foo (foo, FOO, Foo, FoO), ajoutez l'option I (I majuscule) comme suit :
$ sed -i s/foo/bar/gI hello.txt
$ cat hello.txt
Exemples de résultats :
The is a test file created by nixCrft for demo purpose. bar is good. bar is nice. I love bar.
Une note sur la version sed de *BSD et macOS
Veuillez noter que l'implémentation BSD de sed (FreeBSD/OpenBSD/NetBSD/MacOS et co) ne supporte PAS la correspondance insensible à la casse, y compris les mises à jour de fichiers à l'aide de la fonction -i option. Par conséquent, vous devez installer gnu sed. Exécutez la commande suivante sur Apple macOS (installez d'abord home brew sur macOS) :
$ brew install gnu-sed
$ gsed -i s/foo/bar/gI hello.txt
$ gsed -i.BAK s/foo/bar/gI hello.txt
$ cat hello.txt
Problèmes liés à la commande sed
Considérons le fichier texte suivant :
$ cat input.txt
Trouvez le mot "http://" et remplacez-le par "https://www.hebergementwebgratuit.com" :
$ sed s/http:///https://www.hebergementwebgratuit.com/g input.txt
Vous obtiendrez une erreur qui se lit comme suit :
sed: 1: "s/http:///https://www.c ...": bad flag in substitute command: '/'
Notre syntaxe est correcte mais le caractère de délimitation / fait également partie du mot1 et du mot2 dans l'exemple ci-dessus. La commande Sed vous permet de changer le délimiteur / en quelque chose d'autre. Je vais donc utiliser :
$ sed s+http://+https://www.hebergementwebgratuit.com+g input.txt
Exemples de résultats :
https://www.cyberciti.biz is outdate. Consider using https:// for all your needs.
Comment utiliser sed pour faire correspondre des mots et effectuer des recherches et des remplacements ?
Dans cet exemple, ne trouvez que le mot "love" et remplacez-le par "sick" si la ligne contient une chaîne spécifique telle que FOO :
$ sed -i -e /FOO/s/love/sick/ input.txt
Utilisez la commande cat pour vérifier les nouveaux changements :
$ cat input.txt
Récapitulation et conclusion - Utilisation de sed pour trouver et remplacer du texte dans des fichiers donnés
La syntaxe générale est la suivante :
## find word1 and replace with word2 using sed ##
$ sed -i s/word1/word2/g input
## you can change the delimiter to keep syntax simple ##
$ sed -i s+word1+word2+g input
$ sed -i s_word1_word2_g input
## you can add I option to GNU sed to case insensitive search ##
$ sed -i s/word1/word2/gI input
$ sed -i s_word1_word2_gI input
Voir BSD (utilisé aussi sur macOS) sed ou GNU La page de manuel de sed en tapant la commande man/info ou la commande help suivante :
$ man sed
# gnu sed options #
$ sed --help
$ info sed