CLI Bash remove aspas da saída de um comando

12

Estou tentando carregar um arquivo JSON usando jqpor aqui . É bastante simples e funciona:

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

No entanto, preciso atribuir a saída dessa variável a um comando. Eu tentei fazer isso e isso funciona:

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

Mas eu quero /home/qut/Downloads/web.txt.

Como removo as aspas, ou seja, mudo "web"para web?

edesz
fonte

Respostas:

27

Você pode usar o comando tr para remover as aspas:

my_json=$(cat ~/Downloads/json.txt | jq '.name' | tr -d \")
Florian Diesch
fonte
2
Obrigado pelo trcomando ... Eu olhei através de 4 posts diferentes com centenas de votos positivos com pessoas escrevendo mais de 40 caracteres mega-one-liners para fazer o trabalho. Você tem a solução correta (e provavelmente moderna).
Shadoninja
15

No caso específico de jq, você pode especificar que a saída deve estar no formato bruto :

   --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 o json.txtarquivo de amostra do seu link :

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

enquanto que

$ jq -r '.name' json.txt
Google
chave de aço
fonte
1

Você poderia usar eval echoassim:

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

mas isso não é o ideal - poderia facilmente causar bugs e / ou falhas de segurança.

wjandrea
fonte