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?

Respuestas:


27

Puede usar el comando tr para eliminar las comillas:

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

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

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.


Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.