Dans la collection « Je fais mumuse avec sed »

À chaque nouvelle mise à jour de la traduction de LFS, je m'amuse à modifier tous les fichiers du site web. En effet, ce site est totalement statique. Je ne reviendrais pas sur les avantages d'un site statique car, en l'occurence, c'est son défaut qui m'intéresse aujourd'hui. Comme ce site est totalement statique, le menu à droite est présent sur toutes les pages. Cela veut dire que si je veux ajouter un élément dans le menu, je suis obligé de modifier toutes les pages... ce n'est vraiment pas un petit inconvénient vu que je compte 488 pages sur ce site (principalement à cause des pages de réservation pour chaque chapitre des livres LFS et BLFS). Auparavant, je me contentais de modifier les pages principales (une dizaine) mais çe ne me rendait pas très fier du travail réalisé. De plus, je faisais ça souvent rapidement : je corrigeais un menu d'un fichier puis je partais dans un copier/coller de folie sur les autres pages. Malheureusement, le menu indique sur quelle page vous vous trouvez en surlignant la ligne représentant la page... avec le copier/coller, tout le monde pensait rester sur la même page. Je devais donc quand même modifier chaque page manuellement.

M'étant amusé avec sed il y a peu de temps, je me suis dit qu'il serait bien que je me casse la tête une bonne fois pour toutes, histoire de règler définitivement ce problème. La règle est simple : remplacer tous les « LFS-6.0 » par des « LFS-6.1 ». La commande sed suivante le fait (sur un seul fichier, mais on verra ce problème plus tard) :

sed -e 's/LFS-6.0/LFS-6.1/g' downloadmanual.html

Pas mal... mais je me rend compte que, si le texte affiché est bien en majuscule, les liens, eux, sont en minuscules. Très bien, corrigeons cela...

sed -e 's/LFS-6.0/LFS-6.1/gi' downloadmanual.html

Trop facile... ah oui, mais, du coup, mes liens se retrouvent en majuscules... grmblll... bon, nouvelle tentative :

sed -e 's/\(LFS\)-6.0/\1-6.1/gi' downloadmanual.html

Les parenthèses me permettent de conserver l'état dans une première sauvegarde, le \1 permet de la restituer. Très bien. Ah, ce n'est pas fini, il semble que mes liens BLFS-6.0 se soient aussi transformés en liens BLFS-6.1... déjà que la mise à jour de BLFS-6.0 n'est pas terminée, je ne vais pas non plus passer tout de suite à la version suivante :) nouvelle rectification

sed -e 's/\([^B]\)\(LFS\)-6.0/\1\2-6.1/gi' downloadmanual.html

Oula, c'est tout de suite plus compliqué. [^B] veut dire tout sauf le caractère B. Je le sauvegarde pour pouvoir le restaurer après, histoire qu'il ne soit pas supprimé dans la bataille.

Il ne reste plus qu'à écrire le petit script qui se charger de modifier tous les fichiers :

find . -name "*.html" | while read fichier
do
  mv ${fichier} ${fichier}.bak
  cat ${fichier}.bak | sed -e "s/\([^B]\)\(LFS\)-6.0/\1\2-6.1/gi" > ${fichier}
done

Voilà, c'était facile, pas cher et ça fait gagner beaucoup de temps.

Commentaires

1. Le dimanche, juillet 24 2005, 12:12 par Christophe

Si je ne m'abuse, un
sed -i -e "..." ${fichier}
aurait suffit à la place des deux lignes du for, non ?

Ça évite le fichier temporaire et le cat (au sujet des cat qui ne servent à rien :
www.shelldorado.com/artic...
à prendre au second degré !).

Ah tiens, et au sujet de la création des fichiers temporaires :
www.shelldorado.com/goodc...

Hu hu hu, je suis quand même culotté de faire ces remarques au traducteur de l'ABS ;-)

2. Le dimanche, juillet 24 2005, 13:43 par Guillaume Lelarge

Oups, entièrement d'accord pour le sed... c'est vrai que j'ai un peu tendance à utiliser cat pour rien. À ma décharge, j'ai récupéré mon vieil exemple avec plusieurs sed... ah non, c'est même pas une excuse en fait... oups, oups :)

Merci pour les liens, je vais lire ça et j'en prendrais bonne note ;)

3. Le dimanche, juillet 24 2005, 17:22 par Christophe

;-)

De rien :)

Ajouter un commentaire

Les commentaires peuvent être formatés en utilisant une syntaxe wiki simplifiée.

Fil des commentaires de ce billet