Bash CLI elimina las comillas de la salida de un comando

12

Estoy tratando de cargar un archivo JSON usando jqpor aquí . Es bastante sencillo y esto funciona:

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

Sin embargo, necesito asignar la salida de esta variable a un comando. Traté de hacer esto y esto funciona:

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

Pero yo quiero /home/qut/Downloads/web.txt.

¿Cómo se quita las comillas, es decir, el cambio "web"a web?

edesz
fuente

Respuestas:

27

Puede usar el comando tr para eliminar las comillas:

my_json=$(cat ~/Downloads/json.txt | jq '.name' | tr -d \")
Florian Diesch
fuente
2
Gracias por el trcomando ... Revisé 4 publicaciones diferentes con cientos de votos positivos con personas que escribieron más de 40 caracteres de mega-one-liners para hacer el trabajo. Tienes la solución correcta (y probablemente moderna).
Shadoninja
15

En el caso particular de jq, puede especificar que la salida debe estar en formato sin formato:

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

Para ilustrar el uso del json.txtarchivo de muestra de su enlace :

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

mientras

$ jq -r '.name' json.txt
Google
conductor de acero
fuente
1

Podrías usar eval echoasí:

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

pero esto no es lo ideal, podría causar fácilmente errores y / o fallas de seguridad.

wjandrea
fuente