Dans un pipeline JSON, le vrai sujet n’est pas seulement d’enlever des guillemets : c’est de savoir quand jq doit sortir une chaîne en texte brut, et quand il faut transformer la valeur avant l’affichage. La logique derrière jq remove quotes devient simple dès qu’on sépare les guillemets du JSON et ceux qui font réellement partie de la donnée. Je vais montrer les commandes utiles, les cas où `-r` suffit, et ceux où il faut traiter la chaîne plus finement pour éviter de casser le contenu.
Les points essentiels avant de passer au terminal
- `-r` ou `--raw-output` est le réflexe principal pour afficher une chaîne sans guillemets JSON.
- `tostring` convertit une valeur en texte, mais il ne remplace pas la sortie brute.
- Si les guillemets appartiennent au contenu, il faut utiliser `sub()` ou `gsub()`, pas seulement `-r`.
- Sur un objet ou un tableau, jq continue d’émettre du JSON complet, pas du texte brut.
- Dans un script, je préfère décider explicitement quoi faire avec `null` et les champs absents.
Ce que jq fait vraiment avec les guillemets JSON
Par défaut, jq imprime du JSON valide. C’est utile, parce que les chaînes restent correctement échappées et les structures complexes gardent leur forme. Une chaîne JSON apparaît donc entre guillemets, puisque ces guillemets signalent au format JSON qu’il s’agit bien d’une chaîne.
Quand je veux lire une valeur directement dans le terminal, je bascule en sortie brute avec `-r`. jq ne réécrit alors pas la chaîne comme du JSON, il affiche son contenu tel quel. C’est exactement ce qu’on cherche dans la plupart des pipelines vers `cut`, `xargs`, `sed`, un script bash ou un outil qui n’attend pas du JSON.
Exemple simple: `jq -r '.name' data.json` affiche `Alice` au lieu de `"Alice"`. En pratique, ce détail change tout dès qu’un flux sort du monde JSON. C’est ce passage du format structuré au texte brut qui guide le choix de la bonne commande.
Une fois ce mécanisme clair, la commande la plus directe devient évidente.

La commande la plus simple pour afficher une chaîne sans guillemets
Pour une valeur déjà textuelle, je pars presque toujours de `jq -r`. Il n’y a pas d’astuce cachée, juste un bon alignement entre la sortie de jq et le format attendu par la suite du pipeline.
jq -r '.name' user.json
Si le fichier contient `{"name":"Alice"}`, la commande renvoie `Alice`. Si le champ est dans une structure plus profonde, la logique reste la même:
jq -r '.user.profile.email' data.json
Et si je parcours un tableau de chaînes, jq peut sortir chaque ligne sans les guillemets JSON:
jq -r '.[]' tags.json
Le point à retenir est simple: `-r` agit sur l’affichage, pas sur la structure interne de la donnée. Si la sortie finale reste un objet ou un tableau, jq conservera du JSON. Quand la valeur n’est plus une chaîne simple, il faut choisir une technique un peu différente.
Choisir la bonne technique selon le type de valeur
Quand on parle de suppression de guillemets, il y a en réalité trois cas très différents. Je les sépare toujours mentalement avant d’écrire le filtre, sinon on finit vite avec un pipeline qui “marche” seulement sur l’exemple du jour.
| Situation | Commande ou filtre | Ce que ça fait | Quand je l’utilise |
|---|---|---|---|
| Champ JSON déjà textuel | jq -r '.name' |
Affiche la chaîne sans guillemets JSON | Pour un nom, un email, un slug, un libellé |
| Valeur numérique ou mixte | jq -r '.id | tostring' |
Convertit la valeur en texte, puis l’affiche en brut | Quand un champ peut être un nombre, un booléen ou une chaîne |
| Guillemets présents dans le contenu | jq -r '.title | sub("^\"|\"$"; "")' |
Retire seulement les guillemets en début ou en fin de chaîne | Quand les guillemets font partie des données mais encadrent la valeur |
| Tous les guillemets doivent disparaître | jq -r '.snippet | gsub("\""; "")' |
Supprime chaque caractère guillemet | Uniquement si la donnée supporte vraiment cette perte d’information |
Le plus important ici, c’est de ne pas confondre conversion de type et nettoyage de contenu. `tostring` et `@text` servent à normaliser une valeur, alors que `sub()` et `gsub()` modifient le texte lui-même. Quand je dois seulement sortir un champ pour le shell, `-r` suffit presque toujours. Quand je dois corriger le contenu, je traite la chaîne comme des données, pas comme un simple affichage.
Le vrai piège arrive quand les guillemets ne viennent plus du format JSON, mais du contenu lui-même.
Quand les guillemets restent dans les données
Le cas le plus trompeur est celui d’une chaîne qui contient déjà des guillemets en tant que données. Dans ce cas, `-r` enlève seulement l’encodage JSON autour de la valeur, mais il laisse les caractères `"` qui font partie du texte.
{
"title": "\"Bonjour\"",
"snippet": "print(\"ok\")"
}
Avec `jq -r '.title'`, le terminal affiche `"Bonjour"`. Si je veux retirer uniquement les guillemets qui entourent la valeur, j’utilise `sub("^\"|\"$"; "")`. Si je veux supprimer tous les guillemets, `gsub("\""; "")` fait le travail, mais je ne le réserve qu’aux données où ce choix est vraiment acceptable, parce que cela détruit aussi les guillemets utiles dans du code, un titre ou un texte cité.
Autrement dit, supprimer l’encodage JSON et modifier le contenu sont deux opérations différentes. C’est là que beaucoup de scripts deviennent fragiles, alors qu’un seul filtre bien choisi suffit souvent.
Une fois cette distinction posée, les erreurs courantes deviennent faciles à repérer.Les erreurs fréquentes dans les pipelines
Quand `jq` semble ne pas “retirer les quotes”, le problème vient presque toujours d’un mauvais alignement entre la donnée, le filtre et l’outil qui récupère la sortie. Voici les cas que je vois le plus souvent.
- Oublier `-r`. Sans sortie brute, jq continue de produire du JSON, donc les chaînes restent affichées entre guillemets.
- Utiliser `tostring` seul. La conversion a bien lieu, mais la sortie reste une chaîne JSON si on n’ajoute pas `-r`.
- Supprimer tous les guillemets trop tôt. `gsub("\""; "")` peut détruire une donnée utile, surtout dans du code, des citations ou des chemins.
- Confondre champ manquant et chaîne vide. `null` n’est pas `""`. Si je ne le traite pas explicitement, le pipeline peut continuer avec une valeur trompeuse.
- Négliger les quotes du shell. Le filtre jq doit rester entre guillemets simples sous Unix, sinon le shell peut réinterpréter des caractères comme `.` ou `[]`.
Je garde aussi un réflexe simple: si le but final est un autre programme, je teste la sortie avec la commande la plus courte possible avant de l’intégrer à un script plus long. Cela évite les erreurs qui ne se voient qu’au bout de trois ou quatre étapes de pipeline.
Pour éviter ces pièges au quotidien, je préfère quelques règles simples dans les scripts.
Des réflexes sûrs pour les scripts et les chaînes d’outils
Dans un contexte d’automatisation, je ne cherche pas seulement à “enlever les guillemets”. Je veux surtout produire une sortie prévisible, facile à consommer par un autre outil et robuste quand la donnée change légèrement.
| Objectif | Réflexe jq | Pourquoi c’est plus fiable |
|---|---|---|
| Envoyer un champ texte à un script shell | jq -r '.name' |
La sortie devient du texte brut, sans guillemets JSON |
| Gérer une valeur dont le type varie | jq -r '.value | tostring' |
Le pipeline reçoit toujours une chaîne lisible |
| Faire échouer le script si rien n’est produit | jq -re '.email' |
Je détecte plus vite les champs absents ou les valeurs non exploitables |
| Remplacer un champ manquant par une valeur sûre | jq -r '.email // ""' |
Je contrôle explicitement le cas vide au lieu de propager `null` |
Mon principe est assez simple: je garde le JSON tant que je peux, et je passe en sortie brute seulement à la frontière du shell. Si la donnée doit rester structurée pour une API, un backend Node.js, un traitement NoSQL ou un log d’application, je ne supprime pas les guillemets par habitude. Je ne le fais que lorsque le format de sortie l’exige vraiment.
Avec ces réflexes, le dernier point est surtout une affaire de discipline, pas de syntaxe.
Les bons réflexes pour sortir des chaînes sans casser vos données
La règle la plus utile, de mon point de vue, tient en une phrase: `-r` pour l’affichage, `tostring` pour la normalisation, `sub()` ou `gsub()` pour le contenu. Dès qu’on applique cette séparation, jq devient prévisible et bien plus agréable à utiliser dans un pipeline.
- Si la valeur est déjà une chaîne JSON, je pars de `jq -r`.
- Si le type peut changer, j’ajoute `tostring` avant la sortie brute.
- Si des guillemets font partie du texte, je les traite comme des caractères, pas comme un problème d’affichage.
- Si la commande alimente un script, je décide dès le départ quoi faire avec `null` et les champs absents.
En pratique, la plupart des besoins autour de `jq remove quotes` se résolvent avec une seule habitude: choisir entre sortir du JSON ou sortir du texte, au lieu d’essayer de faire les deux à la fois. C’est cette distinction qui évite les scripts fragiles, les résultats ambigus et les corrections manuelles dans la chaîne d’outils.