315 votes

Comment supprimer les guillemets dans la sortie de jq pour l'analyse des fichiers json en bash ?

J'utilise jq pour analyser un fichier JSON comme indiqué ci-dessous aquí . Cependant, les résultats pour les valeurs de chaîne de caractères contiennent les "doubles guillemets" comme prévu, comme indiqué ci-dessous :

$ cat json.txt | jq '.name'
"Google"

Comment puis-je l'intégrer dans une autre commande pour enlever le "" ? ainsi j'obtiens

$ cat json.txt | jq '.name' | some_other_command
Google

Quoi some_other_command puis-je utiliser ?

5 votes

FYI, cat foo | bar est nettement moins efficace que bar <foo ou son équivalent <foo bar , notamment si bar est un programme comme sort qui peut paralléliser ses opérations lorsqu'on lui donne un descripteur de fichier recherchable, par opposition à un FIFO (qui ne peut être lu qu'une seule fois d'avant en arrière). Cela signifie à la fois plus de frais de démarrage (invocation de /bin/cat ), et un plus grand nombre de changements de contexte entre l'espace utilisateur et le noyau (chaque élément de contenu passant par un processus d'authentification). read() sur cat alors a write() à une FIFO dans cat et ensuite un read() dans votre programme de destination, au lieu de passer directement à cette dernière étape).

3 votes

Un autre exemple d'un cas où la différence est importante est le suivant cat foo | wc -c , vs wc -c <foo -- dans le dernier cas, il peut juste faire deux appels syscall, seek() y tell() pour obtenir la taille exacte du fichier, quelle que soit sa longueur ; dans le premier cas, il doit lire jusqu'à la fin, même s'il s'agit de gigaoctets de contenu, parce que seule l'option cat a un accès direct au fichier original, et wc n'a aucun moyen de demander des métadonnées sur lui.

618voto

Charles Duffy Points 34134

Utilisez le -r (ou --raw-output ) pour émettre des chaînes de caractères brutes en sortie :

jq -r '.name' <json.txt

5 votes

Que se passe-t-il si je ne veux rien désencombrer et que je veux juste enlever les guillemets ?

0 votes

En ce moment, j'essaie d'afficher des champs séparés par des tabulations sous la forme d'un joli tableau sur le terminal... Je n'ai pas besoin ou ne me soucie pas de voir les guillemets, je sais que ce sont des chaînes de caractères.

0 votes

[[ $string =~ ^["](.*)["]$ ]] && string="${BASH_REMATCH[1]}" disons.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X