Bash CLI elimina las comillas de la salida de un comando

Bash CLI elimina las comillas de la salida de un comando

Estoy intentando cargar un archivo JSON usando jqperaquí. 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. Intenté 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 elimino las comillas, es decir, las cambio "web"a web?

Respuesta1

Puedes usar eltrcomando para eliminar las comillas:

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

Respuesta2

En el caso particular de jq, puede especificar que la salida debe estar encrudoformato:

   --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 usando el json.txtarchivo de muestra desu enlace:

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

mientras

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

Respuesta3

Es más simple y eficiente usar la función nativa de eliminación de prefijos/sufijos del shell:

my_json=$(cat ~/Downloads/json.txt | jq '.name')
    temp="${my_json%\"}"
    temp="${temp#\"}"
    echo "$temp"

Fuentehttps://stackoverflow.com/questions/9733338/shell-script-remove-first-and-last-quote-from-a-variable

Respuesta4

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.

información relacionada