La CLI Bash rimuove le virgolette dall'output di un comando


12

Sto cercando di caricare un file JSON usando jqper qui . È abbastanza semplice e funziona:

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

Tuttavia, devo assegnare l'output di questa variabile a un comando. Ho provato a fare questo e questo funziona:

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

Ma voglio /home/qut/Downloads/web.txt.

Come rimuovo le virgolette, ovvero cambio "web"a web?

Risposte:


27

È possibile utilizzare il comando tr per rimuovere le virgolette:

my_json=$(cat ~/Downloads/json.txt | jq '.name' | tr -d \")

2
Grazie per il trcomando ... Ho esaminato 4 post diversi con centinaia di voti con persone che scrivevano oltre 40 caratteri mega-one-line per completare il lavoro. Hai la soluzione corretta (e probabilmente moderna).
Shadoninja,

15

Nel caso particolare di jq, è possibile specificare che l'output deve essere in formato raw :

   --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.

Per illustrare usando il json.txtfile di esempio dal tuo link :

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

mentre

$ jq -r '.name' json.txt
Google

1

Puoi usare eval echocosì:

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

ma questo non è l'ideale - potrebbe facilmente causare bug e / o difetti di sicurezza.


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.