awk et le canard de Discord

AJAA numéro 3

Comment rédiger une question à propos d’un problème technique dans un espace d’entraide me permet d’y répondre moi-même et d’utiliser un nouvel outil.

Ce qui se conçoit bien s’énonce clairement

Depuis quelques semaine, interrompu par me série en cours sur le web, j’essayais de réaliser sur ce site une page regroupant les étiquettes (tags) utilisées. Truc trivial s’il en est. Or, je n’arrivais pas à un résultat satisfaisant ni, à mes yeux, cohérent.

J’avais donc « proverbialement » remis sur le métier mon ouvrage jusqu’à la publication d’article intitulé Double-Pagination in Elev­enty par Christopher Kirk-Nielsen qui traite en partie de la construction d’une collection de tags. Remaniant mon code en m’inspirant du sien, j’arrivais… au même résultat décevant.

Prenant mon courage à deux mains, j’entrepris alors de rédiger un appel à l’aide du Discord de la communauté 11ty.js. Soucieux d’être précis et rigoureux, je procédai à la documentation détaillée de mon code et quand, parcourant des yeux un affichage des valeurs brutes de ma collection d’étiquettes, je me suis rendu compte du fait que certaines étaient préfixées par un espace ! Je venais d’expérimenter sans le vouloir la méthode du canard en plastique

Yet Another Markup Issue

Depuis mon adoption d’11ty.js, voir un peu avant avec Kirby[1], les métadonnées de mes billets figurent en tête des fichiers markdown qui les composent. Cela ressemble à ça :

---
titre: Café Léo
soutitre: Le temps des cerises torréfiées
lieu: toulouges
datered: 2023-01-18
datemodif: 2023-05-09
date: 2023-05-09T10:19:03
tags: Perpignan,café
---

Notez dans cet extrait post correction l’absence d’espace entre les mots Perpignan et café, ce qui n’était pas toujours le cas. J’avais été piégé par mes automatismes. N’associant pas ce format très léger à du code, je n’avais jamais songé au fait que ce qui était interprété comme une entrée de tableau était tout caractère trouvé entre deux virgules (ou entre une virgule et une fin de ligne).

Ainsi, selon l’ordre de saisie des tags, en début de liste ou à un autre position, le même mot créait deux entrées. La ligne tags: Perpignan, café crée les étiquettes « Perpignan » et «  café » tandis que tags: café, sans sucre, V60 crée « café », «  sans sucre » et « V60 ».

Il était bien beau de découvrir et comprendre l’origine de mon problème, restait à corriger l’ensemble de mes en-têtes de billet. Lesquels ont été saisis sans grande cohérence selon l’outil ou la période de rédaction.

Aho, Weinberger et Kernighan à la rescousse

Quand j’étais ingénieur hospitalier, à la recherche de toute solution pour m’aider à naviguer au sein du système d’information de l’hôpital de Perpignan, j’avais découvert les précieux fanzine de Julia Evans, notamment Bit Size Command Line qui évoquait le programme awk[2] pour explorer des données stockées dans un fichier texte.

En ayant tâtonné et pesté contre le vide traditionnel des pages man des applications POSIX historiques, je suis arrivé au script suivant :

#! /bin/zsh
for mds in ./*.md
do
  awk -F: 'BEGIN {OFS = FS}{
  if($1 == "tags") {
     gsub(/, /, ",", $2)}
  }1' $mds > "$mds.mod";
cp "$mds.mod" "$mds" && rm "$mds.mod";
done

Il est sans doute imparfait, horripilant pour les puristes mais il a rempli son office. Lancé depuis un répertoire, il exécute les opérations suivantes pour chaque fichier avec une extension « .md ».

  1. demander à awk de chercher la présence de « tags » dans la première colonne
  2. et, le cas échéant, remplacer dans la deuxième colonne la chaîne de caractères constituée d’une virgule et d’un espace par la virgule seule,
  3. puis de retourner toutes les lignes, traitées ou non, dans un fichier .mod
  4. enfin, on procède au remplacement du fichier d’origine par sa version modifiée[3].

En détail pour awk

Y’a plus qu’à…

Voilà, le résultat de l’opération est matérialisé par la page d’exploration lexicale de ce site. Celle-ci met en avant les manques et incohérences de ma classification au fil de l’eau. Je vais donc pouvoir la remanier plus facilement !

Rédigé à Toulouges en mai 2025.