Positionner des espaces insécables avec Sed - 1 dans un fichier
Sous Hugo, les billets sont écrits en Markdown et il faut gérer à la main les espaces insécables répondant aux règles de typographie du français. L’idée est d’utiliser un éditeur non interactif, Sed, pour le faire automatiquement.
Sed est un éditeur non interactif, c’est-à-dire qu’on va pouvoir faire des recherche et ajoute, des recherche et supprime ou encore des recherche et remplace sur des lignes, des mots ou des caractères.
Tout d’abord, on va se créer un fichier texte, à mon sens, typographiqement correct. Mais les espaces sont réalisées par la touche d’espace, ce ne sont pas des espaces insécables. Elles pourraient, sur un écran, ne plus être typographiquement correctes, c’est-à-dire qu’on pourrait se retrouver avec un point de ponctuation en début de ligne par exemple.
Si je cite « une citation » mais ne cite pas « pas ma citation » j'aurais alors un problème de « ».
« et alors ? » me direz-vous, et bien je répond « non solum sed etiam » qui est mon dernier reste de latin.
« quelle tristesse ! » vous exclamez-vous alors, « tant de beauté et si peu d'intelligence... ».
En aparté, je me dis : « c'est à n'y rien comprendre !!! » ; je souris cependant, d'un air entendu.
fin
Je mets tout ça dans un fichier test
. Pour ce faire, j’utilise l’éditeur gedit dont la simplicité me convient. Mais on peut choisir plus compliqué.
Mon cahier des charges est de remplacer certaines espaces par des espaces insécables, c’est-à-dire :
- avant les ? ! ; : et »
- après un «
Une espace insécable se code
sous Markdown.
Dans un premier temps, je veux exécuter une commande de substitution qui va remplacer un guillemet ouvrant suivi d’une espace par un guillement ouvrant suivi d’une espace insécable. En d’autres termes, je veux passer automatiquement de «
à «
.
Le format d’une commande de ce type sous Sed est :
sed [-e] 'instruction' fichier_à_traiter
Donc, je tape sed
suivi de mon ordre d’exécution -e
puis ma commande de substitution 's/« /«\ /
. On est obligé de mettre \
devant le &
sinon il ne l’interprête pas comme un caractère. Enfin j’indique que je veux que cette substitution s’effectue sur le contenu du fichier test
:
sed -e 's/« /«\ /' test
Le résultat s’affiche à l’écran, sans avoir modifié le fichier test (heureusement, car on est en train de tester), comme on le voit sur la figure suivante.
Fonctionnement d'une commande de substitution
figure 1
La première ligne qui s’affiche est
Si je cite « une citation » mais ne cite pas « pas ma citation » j’aurais alors un problème de « ».
On va faire la même chose pour le guillemet fermant, cette fois avec la commande de substitution 's/ »/\ »/'
.
Et en combinant les deux commandes :
sed -e 's/« /«\ /' -e 's/ »/\ »/' test
Mais tout ça ne modifie que la première occurence rencontrée sur chaque ligne, c’est-à-dire qu’on obtient à l’écran
Si je cite « une citation » mais ne cite pas « pas ma citation » j’aurais alors un problème de « ».
« et alors ? » me direz-vous, et bien je répond « non solum sed etiam » qui est mon dernier reste de latin.
« quelle tristesse ! » vous exclamez-vous alors, « tant de beauté et si peu d’intelligence… ».
En aparté, je me dis : « c’est à n’y rien comprendre !!! » ; je souris cependant, d'un air entendu.
fin
C’est le fonctionnement par défaut de Sed. Si je veux que toutes les occurences d’une ligne soient modifiées, il faut que je spécifie un drapeau g (pour global) à la fin de ma commande de subsitution, par exemple 's/ »/\ »/g'
.
On tape maintenant
sed -e 's/« /«\ /g' -e 's/ »/\ »/g' test
Voici alors ce que j’obtiens (je n’ai mis que les deux premières lignes)
Si je cite « une citation » mais ne cite pas « pas ma citation » j’aurais alors un problème de « ».
« et alors ? » me direz-vous, et bien je répond « non solum sed etiam » qui est mon dernier reste de latin.
etc.
Parfait ! Mais il me faut aussi traiter des ? ! ; : restants, c’est-à-dire rajouter des 's/ ?/\ ?/g'
, 's/ !/\ !/g'
, etc. à ma ligne Sed. Heureusement, on peut mettre tout ça dans un fichier texte. Voici le contenu du fichier que j’ai appelé tesu
s/« /«\ /g
s/ »/\ »/g
s/ ?/\ ?/g
s/ !/\ !/g
Fonctionnement avec un fichier de commandes de substitution
figure 2
Pour exécuter cet ensemble de commandes, il suffit de taper
sed -f tesu test
et le terminal affiche alors
Si je cite « une citation » mais ne cite pas « pas ma citation » j’aurais alors un problème de « ».
« et alors ? » me direz-vous, et bien je répond « non solum sed etiam » qui est mon dernier reste de latin.
etc.
C’est parfait, sauf que je me rends compte que j’ai oublié de traiter les deux points (:) et le point virgule (;). Je rajoute donc à la fin de mon fichier tesu les deux lignes
s/ :/\ :/g
s/ ;/\ ;/g
et relance sed -f tesu test
. S’affiche alors au terminal
Si je cite « une citation » mais ne cite pas « pas ma citation » j’aurais alors un problème de « ».
« et alors ? » me direz-vous, et bien je répond « non solum sed etiam » qui est mon dernier reste de latin.
« quelle tristesse ! » vous exclamez-vous alors, « tant de beauté et si peu d’intelligence… ».
En aparté, je me dis : « c’est à n’y rien comprendre !!! » ; je souris cependant, d'un air entendu.
fin
Et voilà ! Mais, concrètement, aucun fichier n’a été modifié (ce qui est judicieusement prudent, me direz-vous). Bien sûr, je pourrais faire une redirection de ma sortie au terminal vers un fichier. Sous Bash, ça donne :
sed -f tesu test > nouveau
Dans ce cadre, le fichier test n’a pas été touché et j’ai un fichier nouveau qui contient ce qui était jusqu’à présent en sortie de terminal (voir figure 3 ci-dessous).
Fonctionnement avec un fichier de commandes de substitution et redirection de la sortie standard
figure 3
Mais Sed a un ordre -i
(pour in place) qui va écrire le nouveau contenu à la place de l’ancien. Écraser des données n’est jamais une bonne chose. Sed offre donc la possibilité de garder la version originale du fichier, mais sous un autre nom, par l’ajout d’un suffixe à l’ordre -i
. Si je tape (j’ai choisi .bak
comme suffixe)
sed -f tesu -i.bak test
le fichier test aura le nouveau contenu plein de
MAIS on aura aussi un fichier test.bak qui contiendra le texte d’origine, avant modification.
Fonctionnement avec un fichier de commandes de substitution et ordre -i
figure 4
C’est tout pour aujourd’hui.
———- La citation :
« Les musiciens s’approchèrent de moi, m’encerclèrent, et j’entonnais les paroles qui, un soir, à la faveur d’une exaspération indescriptible, étaient montées à mon cerveau. Elles s’accordèrent au rythme, épousèrent la musique comme si elles leur avaient été prédestinées. À ceux qui me soignent et m’entourent de prévenances et, d’une manière générale, à ceux qui finiront par me lire, je ne saurais trop conseiller d’entonner ce chant aux moments de détresse et de vague à l’âme :
Ah, Ah,
importons, exportons, fabriquons, emballons, vendons et
croissons,
et vive la betterave
et vive le soja
loués soient les céréales
le maïs et le blé,
vive le porc et la viande de bœuf
importons les beaux morceaux
le rond de gîte et le rumsteck
la bavette et le filet
l’entrecôte et l’onglet
et l’aiguillette baronne
Seigneur
et l’aiguillette baronne exportons
la queue et le tendron
la poitrine et le gros bout
le pot-au-feu et le collier
et la macreuse roulée
Seigneur
et la macreuse roulée ah, ah,
et vive le Père-Lachaise
et vive Rosserys & Mitchell la belle
belle gorge et cul lardeux
belle gorge et cul lardeux.Le succès de mes paroles fut considérable : reprises en chœur par les laquais farineux, les matrones hautaines et corsetées, les musiciens et les cadres d’état-major de notre compagnie, elles retentirent avec bonheur sous la voûte du Goulim. »
René-Victor Pilhes, L’imprécateur (extrait)
Dernière modification: 3 mai 2021
Établi: 29 avril 2021