Sed tout puissant

Article suivant: La récursivité et le mauvais exemple de Fibonacci
Article précédent: Rendre accessible le chargement de lien avec AJAX

Il y a 3 semaines environ je cherchais le moyen d’utiliser la commande sed avec une regex sur plusieurs lignes. Je voulais transformer tous les /\+\n\s+""/ en rien du tout (oui, les supprimer…). Sauf que comme tel, ça ne fonctionne pas, sed comme beaucoup de commandes unix fonctionne par ligne. Après de lourdes et pompeuses recherches d’au moins 7 secondes montre en main, je suis tombé sur la solution.

Pour ce faire, il suffit d’un identifiant, un petit label, une information de multi-ligne au milieu et 3 autres bricoles ; rien que ça :D.

Ce qui se traduit par:

sed -e :a -e N -e '$!ba' -e s'/+\n\s\+""//g'

Et en version courte:

sed ':a;N;$!ba;s/+\n\s\+""//g'

Je sais ce que vous vous demandez: pourquoi il n’y a pas -e dans la version courte ?

Mais parce que c’est la version courte, évidemment !

Sinon dans une moindre mesure.

  • :a: pour créer un identifiant nommé “a”, mais il peut très bien se nommer bidule.
  • N: pour lire la ligne suivante et l’ajouter dans l’espace de recherche.
  • $!ba: Si on n’est pas (!) sur la dernière ligne ($), sauter au label (b) nommé “a”. C’est une boucle.

L’espace de recherche est la partie sur laquelle s’applique une regex. Par défaut, l’espace de recherche ne contient qu’une ligne à la fois qui sont manipulées individuellement. Avec cette boucle, l’espace de recherche contient toutes les lignes (avec saut de ligne) et la regex est appliquée sur l’ensemble du document.

Et en bonus, quelques commandes supplémentaires bons à savoir.

  • sed 2,5s/e/U/g remplace e par U à partir de la ligne 2 jusqu’à la 5.
  • sed "/$debut/,/$fin/"s/A/a/g depuis $debut jusqu’à $fin.
  • sed "/$debut/,+5"s/A/a/g depuis $debut et sur 5 lignes.

Commentaires

Aucun commentaire pour le moment :'(

Le système de commentaire passe par les issues de github et aucun n'est associée au billet. Vous pouvez faire votre commentaire dans une issue qui a comme titre celui du billet. Je me chargerai de les associer.

Revenir en haut