Tym-Project

From: SUPINFO
To: Tous
Subject: IT

SED : Les Astuces à Connaître

[man]Sed[/man] pour ceux qui ne connaîtrait pas encore, est un éditeur de texte en ligne de commande. Concrètement il va éditer un fichier (ou l’entrée standard, via un pipe) et le modifier vers la sortie standard. Rien de moins complexe ! Enfin c’est seulement la définition, car l’outil en lui même peut rapidement devenir très très très riche…
J’ai donc compilé dans cet article un ensemble d’astuces à connaître pour bien utiliser sed.

Je l’utilise essentiellement pour faire des remplacement :

tym@tym-laptop:~$ cat quote.txt
Remember, a Jedi can feel the Force flowing through him.
tym@tym-laptop:~$ sed 's/Jedi/---DUDE WITH A LAMP IN A SOCKET---/g' quote.txt
Remember, a ---DUDE WITH A LAMP IN A SOCKET--- can feel the Force flowing through him.

Voila pour l’exemple, cherchez bien… il-y-a une vanne cachée dans ce texte. Oh et bien entendu sed utilise des expressions régulières !

Mise en mémoire

Pour réutiliser l’expression que vous voulez modifier vous avez deux solutions.Avec ”&” qui représente l’ensemble de la chaîne trouvée :

tym@tym-laptop:~$ sed 's/Jedi/& (A DUDE WITH A LAMP IN A SOCKET)/g' quote.txt
Remember, a Jedi (A DUDE WITH A LAMP IN A SOCKET) can feel the Force flowing through him.

Avec des parenthèses, puis \n pour rappeler l’expression :

tym@tym-laptop:~$ sed 's/\(Je\)\(di\)/\1u\2 (ou Vendredi)/g' quote.txt
Remember, a Jeudi (ou Vendredi) can feel the Force flowing through him.

Notez l’utilisation de “" pour protéger les parenthèses, sans quoi elles seraient considérées comme faisant partie de la chaîne à rechercher.

Trop de slash…

L’exemple précédent contient un sacré nombre de “/” et de “", ne rendant pas la lisibilité de l’expression aisée ! Soyez rassuré, vous avez le choix des délimiteurs :

  • “_” : sed 's_\(Je\)\(di\)_\1u\2 (ou Vendredi)_g' quote.txt
  • ”:” : sed 's:\(Je\)\(di\):\1u\2 (ou Vendredi):g' quote.txt
  • ”|” : sed 's|\(Je\)\(di\)|\1u\2 (ou Vendredi)|g' quote.txt

Une bonne fois pour toute !

Par défaut sed donne le résultat de la commande dans la sortie standard, il est donc assez simple de créer un nouveau fichier contenant les modifications :

tym@tym-laptop:~$ sed 's/Jedi/DUDE WITH A LAMP IN A SOCKET/g' quote.txt > quote_funny.txt

Mais pour réécrire dans le même fichier il faut utiliser l’option -i (“interactive”), une redirection du type sed .... quote.txt > quote.txt ne donnerait qu’un fichier vide :

sed -i 's/Jedi/---DUDE WITH A LAMP IN A SOCKET---/g' quote.txt

Bon matching ;-)

Comments