Konk_Gwin

Positionner des espaces insécables avec Sed - 2 dans une arborescence

Étiquettes:
Citation finale de:
Logiciels évoqués:

L’idée est de balayer l’ensemble de mon site pour corriger automatiquement certains blancs par des espaces insécables, à l’aide de commandes du shell sous Linux.

Pour ceux qui ont des notions de programmation, on trouve une introduction aux scripts shell sur le site OpenClassroom. On peut en trouver plein d’autres sur Internet.

Mais ici on fera beaucoup plus simple.


Préambule

Rappel de l’épisode précédent

On a vu dans le billet précédent comment utiliser Sed pour mettre automatiquement des espaces insécables dans un texte donné, afin de répondre aux règles typographiques de la langue française.

À partir de cette formulation

sed -e 'instruction' fichier_à_traiter

on avait réalisé des substitutions (commande s) d’espaces en espaces insécables, par exemple sur les guillements ouvrants

sed -e 's/« /«\ /' fichier_à_traiter

et en ajoutant le drapeau g pour global afin que toutes les occurences d’une même ligne soient prises en compte

sed -e 's/« /«\ /g' fichier_à_traiter

Comme on avait plusieurs commandes de substitution à effectuer, on les avait mises dans un fichier et utilisé l’ordre -f en lieu et place de -e

sed -f fichier_des_commandes_de_substitution fichier_à_traiter

Enfin, on avait donné l’ordre de modifier le fichier à traiter (ordre -i pour in place) tout en conservant le contenu initial du fichier à traiter dans un fichier de même nom suivi d’un suffixe

sed -f fichier_des_commandes_de_substitution -isuffixe fichier_à_traiter
Fonctionnement avec un fichier de commandes de substitution et ordre -i (figure 4 du billet précédent)

Fonctionnement avec un fichier de commandes de substitution et ordre -i

figure 4 du billet précédent

Structuration des répertoires

Maintenant, on va voir comment faire pour généraliser ce traitement à l’ensemble des billets de mon site konk_gwin, dont le nom de répertoire de travail est konkgwin.

Avec Hugo, l’ensemble des billets (au format Markdown) est dans le répertoire content. En d’autres termes, dans content on a toute une arborescence (la structure du site) dont les feuilles sont des fichiers suffixés en .md (les billets rédigés en Markdown).

Pour héberger mon traitement de maintenance automatisé, je vais créer à côté du répertoire konkgwin un répertoire konkmaintenance qui contiendra mes programmes et fichiers de maintenance du site konk_gwin.

Structure arborescente du répertoire de travail du site Konk_Gwin et de son répertoire de maintenance

Structure arborescente du répertoire de travail du site Konk_Gwin et de son répertoire de maintenance

figure 1

Cahier des charges

Le cahier des charges est simple : automatiser certaines corrections typographiques (mise en place d’espaces insécables) sur les billets du site konk_gwin.

Pour ne pas compliquer inutilement le travail à réaliser, on exclura certains billets, notamment ceux qui traitent de ces mêmes corrections typographiques (dont ce billet, naturellement).

Mise en oeuvre

Nous allons mettre en oeuvre plusieurs commandes Bash qui vont nous permettre d’arriver simplement à nos fins.

Constituer la liste des billets à traiter

Obtenir la liste de tous les billets

Maintenant pour avoir la liste de tous billets à traiter, il suffit d’ouvrir un terminal virtuel dans konkmaintenance et de taper :

 find ../konkgwin/content/ -name "*.md" > liste

Dans cette instruction utilisant la commande find, nous avons

  • défini le répertoire à partir duquel balayer l’arborescence (../konkgwin/content/) ;
  • précisé que la recherche s’effectue sur le nom des fichiers (-name) car plein d’autres types de recherche existent, la commande find est extrêment riche à ce sujet ;
  • indiqué le critère de recherche sur le nom ("*.md") qui signifie que nous cherchons n’importe quelque fichier (*) dont le suffixe soit md (.md est le suffixe des fichiers texte rédigés en Markdown) ;
  • enfin nous avons redirigé le résultat de la commande ( avec le signe >) dans un fichier que nous avons appelé liste.

Pour vérification, nous affichons les cinq premières lignes du fichier liste en tapant la commande head -5 liste

../konkgwin/content/apropos.md
../konkgwin/content/_index.md
../konkgwin/content/comprendre/visualisation/graphiques_01/graphiques_01.md
../konkgwin/content/comprendre/visualisation/graphiques_02/graphiques_02.md
../konkgwin/content/comprendre/visualisation/_index.md

Exclure certains billets pour lesquels les règles typographiques ne doivent pas s’appliquer systématiquement.

Comme écrit dans le cahier des charges, certains billets sont à exclure, car les règles typographiques ne doivent pas s’y appliquer automatiquement.

Il faut par exemple enlever de la liste la ligne ../konkgwin/content/faire/shell/shell_01-sed1.md.

Cela revient à supprimer toute ligne contenant shell_01-sed1.md du fichier liste. Avec Sed, pour une suppression de ce type, on utilise alors la formulation '/élément_à_rechercher/d' (d pour delete, soit supprimer en anglais) :

 sed -e '/shell_01-sed1.md/d' liste

Comme il faut que cette suppression impacte le fichier liste, on va ajouter l’ordre -i pour in place :

 sed -e '/shell_01-sed1.md/d' -i liste

Enfin, il est probable qu’au cours de la vie du site, il y aura d’autres billets à exclure de la liste à traiter. Donc on va mettre en oeuvre un fichier contenant les commandes d’eclusion. Il faudra bien sûr maintenir ce fichier à la main au fur et à mesure du temps. Pour l’instant, il ne contient que deux lignes correspondant aux deux billets traitant des règles typographiquses :

 '/shell_01-sed1.md/d'
 '/shell_01-sed2.md/d'

Si j’appelle listexclus le fichier contenant ces commandes de suppression de ligne, l’instruction devient :

 sed -f listexclus -i.bak liste

On remarquera que la prudence m’est revenue puisque la version du fichier liste avant exclusion sera sauvegardée dans le fichier liste.bak (le fonctionnement de l’ordre -i a été expliqué dans le billet précédent).

Pour chaque ligne de la liste des billets du site, lancer le traitement de substitution

Chaque ligne du fichier liste est constituée du nom d’un billet à traiter. On va utiliser une boucle while pour faire une lecture ligne à ligne. Une boucle while utilise les mots réservés while (pour tant que), do (pour faire) et done (pour c’est fait) :

while faire_qqch; do faire_autre_chose; done

Par exemple, on va lire chaque ligne du fichier liste tant qu’il y en a (while read ligne;) puis afficher le contenu de la ligne, précédée d’une flèche, sur le terminal (do echo '--> '$ligne;) et c’est tout (done).

while read ligne; do echo '--> '$ligne;done < liste

Pour faire la même chose, certains utilisent la commande cat :

cat liste

qui affiche ici le contenu du fichier liste sur la sortie standard (c’est-à-dire sur l’écran du terminal virtuel). Il suffit ensuite de tuber cette sortie à la boucle while :

cat liste | while read ligne; do echo '--> '$ligne;done

Bien que cette formulation soit plus compréhensible pour le commun des mortels, les puristes considèrent dans ce cas l’utilisation de cat comme inefficiente et donc à proscrire.

Maintenant, plaçons l’ensemble des commandes de substitution (voir le billet précédent) dans un fichier listeremplace. Comme on avait vu, la formulation est alors la suivante :

sed -f listeremplace -i.bak fichier_à_traiter

où le fichier_à_traiter sera le fichier contenant les modifications réalisées par Sed et où le_fichier_à_traiter.bak sera le fichier avant traitement.

Il ne reste plus qu’à porter les modifications sur l’ensemble des billets dont les noms sont contenus dans le fichier liste.

while read billet; do sed -f listeremplace -i.bak $billet;done < liste
figure 2 - Schéma de fonctionnement de la boucle de substitution des espaces

Schéma de fonctionnement de la boucle de substitution des espaces

figure 2

En faire un script Bash, ou pas

En conclusion, pour répondre au cahier des charges, trois lignes d’instructions, exécutées au niveau du répertoire konkmaintenance , ont suffi :

find ../konkgwin/content/ -name "*.md" > liste
sed -f listexclus -i.bak liste
while read billet; do sed -f listeremplace -i.bak $billet;done < liste

Étant particulièrement indolent, j’ai tendance à enregistrer tout ça dans un fichier texte, l’agrémenter de quelques commentaires explicatifs (toute ligne commençant par # est considérée comme un commentaire par Bash) puis, en tant que de besoin, faire un copier-coller de ces lignes de code dans un terminal virtuel pour exécution.

Des personnes sérieuses, elles, écriront un script Bash. Appelons-le guillemet ou guillemet.sh, .sh, étant le suffixe pour distinguer les programmes shell. La première ligne sera immanquablement #!/bin/bash. Puis on y mettra les instructions nécessaires. Cela pourrait donner :

#!/bin/bash
# guillemet.sh remplace des espaces par des espaces insécables
# dans les billets de l'arborescence du site konk_gwin
# --- à noter
# le fichier listexclus répertorie les billets à ne pas transformer
# le fichier listeremplace contient les commandes de substitution
# ces deux fichiers sont maintenus à la main
# ---
echo "# 1- obtenir la liste de l'ensemble des billets du site"
find ../konkgwin/content/ -name "*.md" > liste
echo "# 2- exclure certains billets délicats listés dans listexclus"
sed -f listexclus -i.bak liste
echo "# 3- effectuer les substitutions sur l'arborescence modifiée"
while read billet; do sed -f listeremplace -i.bak $billet;done < liste

Il suffit ensuite de taper

bash guillemet

pour exécuter le script.

D’autres souhaiterons peut-être rendre le programme exécutable (chmod +x nom_du_programme) et modifier les chemins d’exécution avec un export PATH, mais pas moi.


———- La citation :

La petite fille
au chapeau d’harlequin
— Qui est-elle ? Je ne la connais pas —
enfonce, en riant, ses mains
dans les yeux des dormeurs.
Amoureuse des songes,
si féroce déjà.
— Qui est-elle ? Je ne la connais pas —
Elle m’ignore aussi,
car mes yeux, épris d’eux-mêmes,
se dévorent la nuit.

Edmond Jabès « Chanson de la petite fille féroce » du recueil Chansons pour le repas de l’ogre (1943-1945) in Le Seuil le Sable : poésies complètes 1943-1988, Gallimard, coll. « Poésie »


Menu