SED (ou Stream EDitor) est un éditeur non-interactif, un outil en mode commande très puissant, qui fait partie des « Unix tools » depuis la nuit des temps (1973). On peut également trouver une version windows.
Pourquoi en ai-je eu besoin ? Voulant personnaliser un site web généré automatiquement par Gramps (un logiciel de généalogie), il me fallait pouvoir remplacer un mot par un autre, et ceci dans plusieurs fichiers situés dans une multitude de sous-répertoires.
Je reviendrai probablement sur Gramps plus en détail dans un autre article, car c’est vraiment un bon logiciel.
Le site web de Gramps
Le site web en question liste en plusieurs onglets les noms de famille, les individus, les lieux, les sources, une galerie photo (si vous en avez ajouté). Et une fois un individu sélectionné, ses données sont listées, et un mini arbre de ses ascendants affiché. Plutôt pas mal.
Mais voilà, je voulais y ajouter l’arbre généalogique complet, un document au format PDF (Acrobat) également réalisé à l’aide de Gramps.
Après quelques recherches, je vois que Gramps permet affectivement d’ajouter un onglet à la génération du site et d’y mettre le texte que l’on souhaite, soit exactement ce qu’il me fallait ! Hélas, il nomme (très arbitrairement) ce nouveau premier onglet « Souche« . Et moi je voulais qu’il s’appelle « Arbre« .
J’ai commencé par modifier manuellement les quelques fichiers .html à la racine du site, puis je me suis rendu compte que le mot en question existait sur chaque page html dans une multitude de sous-répertoires générés par gramps lors de la création du site. Impossible à faire à la main.
Le script
C’est là qu’intervient sed, l’éditeur de flux ! un éditeur non interactif donc, et qui va éditer les fichiers indiqués, les lire ligne par ligne, et y apporter les modifications demandées. Puissant, non ? Vous lui dites ce que vous voulez modifier dans les fichiers, et il le fait. Il gère les expressions régulières, peut supprimer, ajouter, substituer, trier, bref à peu près tout ce que l’on peut avoir besoin de faire sur un ficher texte.
J’ai donc commencé par lire un article de Linux magazine sur cette commande, pratiqué un peu, et suis parvenu très facilement à faire ce que je voulais… mais dans un seul répertoire ! Et pas un mot dans l’article pour faire la même chose sur une arborescence de fichiers.
Après quelques recherches sur le net, il faut finalement utiliser conjointement la commande find, et créer un petit script (info trouvé sur la page FAQ de sed, vraiment très complète).
Voilà donc ce petit script :
#! /bin/sh
# nom du fichier : replaceall.sh
# pas de SAUVEGARDE des fichiers faite par ce script.
find . -type f -name '*.html' -print | while read i
do
sed "s|$1|$2|g" $i > $i.tmp && mv $i.tmp $i
done
Enregistrer ce fichier, l’appeler par exemple replaceall, et enfin lui donner les droits d’exécution. Il suffit ensuite de le lancer à partir de la racine du site généré par Gramps :
$ ./replaceall Souche Arbre
Et voilà, en quelques secondes, chaque occurrence du mot Souche a été remplacé par le mot Arbre.
En savoir plus sur sed
On trouve pas mal de sites expliquant ou détaillant l’utilisation de sed, comme par exemple :
http://www.commentcamarche.net/faq/478-sed [fr]
http://sed.sourceforge.net/sedfaq.html [us]
Pour les plus motivés
Lisez la suite, ce sont les notes prises lors de mon « auto-formation ». Cela donne aussi un aperçu de la puissance de la ligne de commande.
Continuer la lecture… SED – Stream EDitor →