web-dev-qa-db-ja.com

Bash CLIはコマンドの出力から引用符を削除します

jq per here を使用してJSONファイルをロードしようとしています。それは非常に簡単で、これは機能します:

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

ただし、この変数の出力をコマンドに割り当てる必要があります。私はこれをやろうとしましたが、これは機能します:

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

しかし、私は/home/qut/Downloads/web.txtが欲しいです。

引用符を削除するには、つまり"web"webに変更しますか?

8
edesz

tr コマンドを使用して、引用符を削除できます。

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

jqの特定のケースでは、出力がraw形式であることを指定できます。

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

リンク のサンプルjson.txtファイルの使用方法を説明するには:

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

一方

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

次のようにeval echoを使用できます。

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

しかしこれは理想的ではありません-バグやセキュリティ上の欠陥を簡単に引き起こす可能性があります。

1
wjandrea

ネイティブのシェル接頭辞/接尾辞削除機能を使用して、よりシンプルで効率的な方法があります。

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

ソース https://stackoverflow.com/questions/9733338/Shell-script-remove-first-and-last-quote-from-a-variable

0
Agnel Vishal