Sed et 2/3 astuces

Dernièrement j’ai du reprendre du vieux code sans historique ou documentation utile. Du fait des évolutions demandées, ce code demandait plus qu’un gros ménage de printemps.
En tant que vieux code, parmi tous ces fichiers HTML, javascipt et php, j’ai traouvé beaucoup de codes redondants et obsolètes.
Avec sed on peut traiter un certain nombre de cas foireux. Voici des astuces qui ne demandent qu’à être complétées.

Remplacer du texte écrit sur plusieurs lignes

L’astuce provient de austin matzko
Le principe en théorie est simple, on stocke en mémoire tampon tout le fichier et on ensuite on traite l’expression régulière.

find ./ -type f -exec sed -i -n '1h;1!H;${;g;s/if ($.browser.*browser.version;//g;p;}' {} \;

Dans cet exemple on recherche un bloc de texte qui commence par if ($.browser et qui fini par browser.version ; et on le remplace par rien.

Ainsi on peut retirer du code obsolète faisant un usage intensif de $.browser

Non je ne veux pas de ce mode greedy

Comme vous le savez sed est vorace, et ne connaît que le mode greedy. Lorsqu’on veut être précis dans sa recherche, parfois sed va trop loin et prend un résultat trop conséquent.
Torstein Krause Johansen propose une solution relativement élégante en exploitant une classe d’exclusion.

sed -i -n '1h;1!H;${;g;s/function mafonction[^}]*}//g;p;}' monfichier.php

Dans cet exemple on peut retire intégralement la fonction mafonction où qu’elle se trouve dans le fichier php. Vous aurez remarquer qu’on profite de l’astuce précédente.
La nouveauté est [^}]*} on arrête la recherche dès la premier } trouvé.

 Mélanger apostrophe et guillemet

Kent sur stackoverflow propose d’exploiter les codes héxadécimaux \x27 pour et \x22 pour ". Selon le type de fichier cela peut marcher. Cette astuce n’est pas à 100% garantie mais cela peut depanner lorsque le fichier s’y prete.

 Traiter les accents

Ce n’est pas à proprement parler une astuce pour sed, mais une information à garder dans le coin de la tête. Sed se base sur la locale déclarée dans le teminal et non sur celui possible du fichier traité. Comme il arrive souvent d’avoir des mélanges de fichiers latin et ut8 voir le mélange dans le même fichier.
Dans le cas des distribution linux, il est possible de changer la locale (dont le jeu de caractères) via la variable $LANG

locale -a
echo $LANG
LANG=fr_FR.iso885915@euro

Un message, un commentaire ?

Qui êtes-vous ?
Votre message

Pour créer des paragraphes, laissez simplement des lignes vides.