[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 ;-)