web-dev-qa-db-ja.com

JSONを解析してシェルスクリプト内の配列

シェルスクリプト内のJSONオブジェクトを配列に解析しようとしています。

例:[Amanda、25、 http://mywebsite.com]

JSONは次のようになります。

{
  "name"       : "Amanda", 
  "age"        : "25",
  "websiteurl" : "http://mywebsite.com"
}

ライブラリは使いたくありません。正規表現またはgrepを使用できれば最高です。私がやった:

myfile.json | grep name

これにより、「名前」:「アマンダ」が得られます。ファイル内の各行のループでこれを実行し、配列に追加できますが、行全体ではなく右側のみが必要です。

11

jqはこの問題を解決するのに十分です

paste -s <(jq '.files[].name' YourJsonString) <(jq '.files[].age' YourJsonString) <( jq '.files[].websiteurl' YourJsonString) 

テーブルを取得し、任意の行をgrepするか、任意の列をawk印刷できるようにします

3
Dr_Hope

Sed one linerを使用してこれを実現できます。

array=( $(sed -n "/{/,/}/{s/[^:]*:[[:blank:]]*//p;}" json ) )

結果:

$ echo ${array[@]}
"Amanda" "25" "http://mywebsite.com"

引用符が必要ない場合は、次のsedで引用符が不要になります。

array=( $(sed -n '/{/,/}/{s/[^:]*:[^"]*"\([^"]*\).*/\1/p;}' json) )

結果:

$ echo ${array[@]}
Amanda 25 http://mywebsite.com

次のような複数のエントリがある場合にも機能します

$ cat json
{
  "name"       : "Amanda" 
  "age"        : "25"
  "websiteurl" : "http://mywebsite.com"
}

{
   "name"       : "samantha"
   "age"        : "31"
   "websiteurl" : "http://anotherwebsite.org"
}

$ echo ${array[@]}
Amanda 25 http://mywebsite.com samantha 31 http://anotherwebsite.org

更新:

コメントでmklement0が指摘しているように、ファイルに空白が埋め込まれている場合、たとえば"name" : "Amanda lastname"。この場合、Amandalastnameは両方とも別々の配列フィールドに読み込まれます。これを回避するには、readarrayを使用できます。たとえば、

readarray -t array < <(sed -n '/{/,/}/{s/[^:]*:[^"]*"\([^"]*\).*/\1/p;}' json2)

これは、コメントでも言及されている、グロビングの問題も処理します。

1
nautical