Voir mon introduction à la prise en main de jq
, le logiciel de manipulation de JSON en ligne de commande.
Soit le fichier JSON africa-coast-to-europe-ace.json.
Avec jq
version 1.5.1 Debian GNU/Linux Buster, je veux récupérer la valeur de l'attribut « owners » sous la forme d'une unique chaîne de caractère. Je voudrais que la séparation entre chaque propriétaire ne soit plus « , », mais « \n * » (afin de produire une liste à puces).
Facile, il suffit d'utiliser la fonction gsub(), greedy sub(), qui permet de remplacer des bouts de chaînes de caractères. Sauf que…
$ jq -r '.owners | " * \(gsub(", ";"\n *"))"' africa-coast-to-europe-ace.json
* Orange
* Dolphin Telecom
* Cote d’Ivoire Telec
*
* Gambia Submarine Cable Company
* MTN
[…]
Hum, il y a un raté pour Cote d'Ivoire Telecom.
Je t'épargne l'identification du problème avec hexdump -C
et jq -a
(afficher le code séquence d'un caractère non-ASCII) : ce modèle d'apostrophe n'est pas un caractère ASCII mais Unicode.
Normalement, ça ne devrait pas poser de problème puisque jq
travaille, par défaut, en UTF-8 (d'après son manuel). De plus, file -i
est formel, le fichier utilisé est bien encodé en UTF-8. Même si j'utilise iconv -t UTF-8 africa-coast-to-europe-ace.json -o africa-coast-to-europe-ace.json
pour m'en assurer, ça change rien.
J'ai essayé avec d'autres caractères Unicode : ça fonctionne avec « » » et des caractères Hangûl, mais pas avec le caractère « ⚧ »…
J'en déduis que la fonction gsub() de jq
foire avec certains caractères Unicode.
J'ai rien trouvé de mieux que de remplacer l'aspostrophe problématique par l'apostrophe ASCII avec sed -i "s/’/'/" africa-coast-to-europe-ace.json
avant son traitement par jq
…
Ce bug semble être corrigé dans la version 1.6 Debian GNU/Linux de jq
.