Présentation

jq est un processeur de flux JSON en ligne de commande. Il lit le texte d’entrée, l’analyse selon la spécification RFC 8259, puis le ré‑émet sous forme indentée lorsqu’on utilise le filtre '.'. L’article décrit une alias qui exploite cette capacité pour reformater le contenu du presse‑papiers, puis le replacer dans le même presse‑papiers.

Implémentation macOS

Sur macOS, les utilitaires pbpaste et pbcopy permettent respectivement de lire et d’écrire le presse‑papiers. L’alias initial est :

alias jsontidy="pbpaste | jq '.' | pbcopy"

Le pipeline lit le texte brut, le passe à jq qui le reformate, puis le renvoie à pbcopy. Aucun paramètre supplémentaire n’est requis, ce qui rend l’outil immédiatement utilisable dans un terminal macOS.

Adaptation Linux avec xclip

Linux ne possède pas pbpaste/pbcopy. L’article propose xclip avec l’option -selection clipboard pour cibler le presse‑papiers système :

xclip -selection clipboard -o | jq '.' | xclip -selection clipboard

Le drapeau -o indique la lecture, tandis que l’absence de -i implique l’écriture. Cette version conserve la même logique que la version macOS, mais dépend de la disponibilité de xclip et de son accès au serveur X.

Gestion d’erreur et limites

Si le texte du presse‑papiers n’est pas du JSON valide, jq renvoie un code de sortie non nul et écrit sur stderr un message tel que parse error: Invalid numeric literal at line 1, column 6. Le pipeline original écrase alors le presse‑papiers avec une chaîne vide, car le flux stdout est vide mais le pipe ne tient pas compte du code d’erreur.

Pour éviter cette perte de données, l’alias est modifié :

alias jsontidy="xclip -selection clipboard -o | (jq '.' || xclip -selection clipboard -o) | xclip -selection clipboard"

Le sous‑shell (jq '.' || xclip -selection clipboard -o) exécute jq puis, en cas d’échec, relance xclip -o pour renvoyer le texte original. Ainsi, le résultat final est soit le JSON formaté, soit le texte inchangé. Cette technique repose sur l’opérateur logique ||, qui ne s’exécute que si la commande précédente renvoie un code de sortie différent de zéro.

Les limites restent liées à la dépendance aux outils externes (jq, xclip ou pbpaste/pbcopy) et à la capacité du terminal à gérer de très gros documents JSON. Aucun mécanisme de tamponnage n’est prévu ; un fichier de plusieurs mégaoctets peut saturer la mémoire du processus jq. De plus, l’alias ne traite pas les encodages non UTF‑8, ce qui peut entraîner des erreurs de décodage avant même l’analyse JSON.