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.