Bash CLI, bir komutun çıktısından alıntıları kaldırır


12

Ben kullanarak bir JSON dosyası yüklemek çalışıyorum jqbaşına burada . Oldukça basittir ve bu işe yarar:

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

Ancak, bu değişkenin çıktısını bir komuta atamam gerekiyor. Bunu yapmaya çalıştım ve bu işe yarıyor:

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

Ama istiyorum /home/qut/Downloads/web.txt.

Nasıl tırnak, yani değişim kaldırırım "web"için web?

Yanıtlar:


27

Sen kullanabilirsiniz tr tırnak kaldırmak için komut:

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

2
trKomuta için teşekkür ederim ... İşi yapmak için 40+ karakter mega-one-liner yazan insanlarla yüzlerce upvotes ile 4 farklı gönderiye baktım. Doğru (ve muhtemelen modern) bir çözüme sahipsiniz.
Shadoninja

15

Belirli bir durumda jq, çıktının ham biçimde olması gerektiğini belirtebilirsiniz :

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

Bağlantınızdaki örnek json.txtdosyayı kullanarak göstermek için :

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

buna karşılık

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

1

Bunun eval echogibi kullanabilirsiniz :

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

ancak bu ideal değildir - kolayca hatalara ve / veya güvenlik hatalarına neden olabilir.


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.