Bash CLI supprime les guillemets de la sortie d'une commande

12

J'essaie de charger un fichier JSON en utilisant jqpar ici . C'est assez simple et cela fonctionne:

$ cat ~/Downloads/json.txt | jq '.name'
"web"

Cependant, je dois affecter la sortie de cette variable à une commande. J'ai essayé de faire ça et ça marche:

$ my_json=`cat ~/Downloads/json.txt | jq '.name'`
$ myfile=~/Downloads/$my_json.txt
$ echo $myfile
/home/qut/Downloads/"web".txt

Mais je veux /home/qut/Downloads/web.txt.

Comment supprimer les guillemets, c'est- "web"à- dire passer à web?

edesz
la source

Réponses:

27

Vous pouvez utiliser la commande tr pour supprimer les guillemets:

my_json=$(cat ~/Downloads/json.txt | jq '.name' | tr -d \")
Florian Diesch
la source
2
Merci pour la trcommande ... J'ai parcouru 4 messages différents avec des centaines de votes positifs avec des personnes écrivant plus de 40 méga-lignes pour faire le travail. Vous avez la bonne solution (et probablement moderne).
Shadoninja
15

Dans le cas particulier de jq, vous pouvez spécifier que la sortie doit être au format brut :

   --raw-output / -r:

   With this option, if the filter´s result is a string then  it  will
   be  written directly to standard output rather than being formatted
   as a JSON string with quotes. This can be useful for making jq fil‐
   ters talk to non-JSON-based systems.

Pour illustrer l'utilisation de l'exemple de json.txtfichier à partir de votre lien :

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

tandis que

$ jq -r '.name' json.txt
Google
tournevis
la source
1

Vous pouvez utiliser eval echocomme ceci:

my_json=$(eval echo $(cat ~/Downloads/json.txt | jq '.name'))

mais ce n'est pas idéal - pourrait facilement provoquer des bugs et / ou des failles de sécurité.

wjandrea
la source