Bash CLI usuwa cudzysłowy z danych wyjściowych polecenia

12

Próbuję załadować plik JSON jqza pomocą tutaj . Jest to dość proste i działa:

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

Jednak muszę przypisać wynik tej zmiennej do polecenia. Próbowałem to zrobić i to działa:

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

Ale ja chce /home/qut/Downloads/web.txt.

Jak usunąć cytaty, tj. Zmienić "web"na web?

edesz
źródło

Odpowiedzi:

27

Możesz użyć polecenia tr, aby usunąć cudzysłowy:

my_json=$(cat ~/Downloads/json.txt | jq '.name' | tr -d \")
Florian Diesch
źródło
2
Dziękuję za trpolecenie ... Przejrzałem 4 różne posty z setkami pozytywnych opinii z ludźmi piszącymi ponad 40 postaci mega-one-linerów, aby wykonać zadanie. Masz właściwe (i prawdopodobnie nowoczesne) rozwiązanie.
Shadoninja
15

W konkretnym przypadku jqmożesz określić, że dane wyjściowe powinny mieć format surowy :

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

Aby zilustrować użycie przykładowego json.txtpliku z linku :

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

natomiast

$ jq -r '.name' json.txt
Google
steeldriver
źródło
1

Możesz użyć eval echotego w następujący sposób:

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

ale nie jest to idealne - może łatwo powodować błędy i / lub wady bezpieczeństwa.

wjandrea
źródło