Rechercher et remplacer en ligne de commande bash shell en utilisant sed

Quand on apprécie de travailler en ligne de commande sur son shell préféré, on cherche forcément à être productif.

Quoi de mieux dans le cas d’un rechercher / remplacer de masse, que d’utiliser des outils précis et rapides afin de travailler intelligemment, afin d’éviter un travail répétitif inutile et fastidieux.

Donc voici des solutions simples pour gagner du temps grâce à « Sed » (plus d’info). sed est un outil extrêmement puissant pour qui sait le manier, et dans notre exemple de traitement de masse, il va nous être d’une aide précieuse.

Nous allons utiliser la syntaxe suivante pour trouver et remplacer une chaîne de caractère dans un fichier texte :

bash# sed -i ’s/[texte_recherché]/[texte_de_remplacement]/’ monfichier.txt

Pour l’exercice nous allons dire que monfichier.txt comporte une liste d’anciennes adresses email @wanadoo.fr et que nous désirons les mettre à jour en @orange.fr .

bash# cat monfichier.txt
toto@wanadoo.fr
toto@wanadoo.fr
toto@wanadoo.fr
etc.

Donc dans ce cas, cela nous donnera :

bash# sed -i ’s/wanadoo/orange/g’ monfichier.txt

Voilà en détail l’explication :

  • On passe à la commande sed le paramètre « -i » pour l’édition du fichier monfichier.txt
  • Le paramètre « -s » (substituer) qui définit l’action de rechercher / remplacer,
  • l’expression régulière (REGEX),
  • puis le ‘g’ (action global) à la suite pour la modification de toutes les instances de la chaîne de caractères remplacer dans le fichier.
  • Dans le cas où on voudrait ne remplacer que la première qui aurait été trouvée, il faudra modifier comme suit : ‘s/texte1/texte2/’

Bon, cela fonctionne sur un fichier, maintenant dans le cas de plusieurs fichiers, voici la commande ‘find’ qui va compléter l’astuce.

bash# find . -maxdepth 1 -name « *.txt » -type f -exec sed -i ’s/wanadoo/orange/g’ {} \

En détail cela nous donne:

  • Nous utilisons la commande ‘find’ pour récupérer la liste des fichiers ‘.txt’ à traiter,
  • dans le dossier courant ‘.’ et de ne pas aller plus bas ‘-maxdepth 1′,
  • puis donc de lister les fichiers dont le nom finit par « *.txt » :  ‘-name « *.txt » -type f’.
  • on utilise alors l’option ‘-exec’ pour dire à ‘find’ d’utiliser la commande qui suit sur les fichiers trouvés.

Et voilà, simple non ?

Pour plus de possibilités n’hésitez pas à utiliser le MAN (man find et/ou man sed) ainsi que la page sed dans le wikipédia.

Partager :
  • Digg
  • del.icio.us
  • Tumblr
  • Facebook
  • Mixx
  • Google Bookmarks
  • LinkedIn
  • email
  • MySpace

Laisser un commentaire

Supersonique Studio a développé une compétence unique en stratégie internet. Nos services comprennent le positionnement pour les moteurs de recherche, le conseil, l'audit, l'élaboration de stratégies marketing, et bien plus encore...
Supersonique Studio
85 Rue de Cannes
06110 Le Cannet, France
Tél : +33 49 399-8112
Mél : infos[at]supersonique.net
French flagItalian flagKorean flagChinese (Simplified) flagChinese (Traditional) flagPortuguese flagEnglish flagGerman flagSpanish flagJapanese flagArabic flag
Russian flagGreek flagDutch flagBulgarian flagCzech flagCroatian flagDanish flagFinnish flagHindi flagPolish flagRomanian flag
Swedish flagNorwegian flagCatalan flagFilipino flagHebrew flagIndonesian flagLatvian flagLithuanian flagSerbian flagSlovak flagSlovenian flag
Ukrainian flagVietnamese flagAlbanian flagEstonian flagGalician flagMaltese flagThai flagTurkish flagHungarian flagBelarus flagIrish flag
Icelandic flagMacedonian flagMalay flagPersian flag       
By N2H