シェルスクリプト内のJSONオブジェクトを配列に解析しようとしています。
例:[Amanda、25、 http://mywebsite.com]
JSONは次のようになります。
{
"name" : "Amanda",
"age" : "25",
"websiteurl" : "http://mywebsite.com"
}
ライブラリは使いたくありません。正規表現またはgrepを使用できれば最高です。私がやった:
myfile.json | grep name
これにより、「名前」:「アマンダ」が得られます。ファイル内の各行のループでこれを実行し、配列に追加できますが、行全体ではなく右側のみが必要です。
jqはこの問題を解決するのに十分です
paste -s <(jq '.files[].name' YourJsonString) <(jq '.files[].age' YourJsonString) <( jq '.files[].websiteurl' YourJsonString)
テーブルを取得し、任意の行をgrepするか、任意の列をawk印刷できるようにします
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"
。この場合、Amanda
とlastname
は両方とも別々の配列フィールドに読み込まれます。これを回避するには、readarray
を使用できます。たとえば、
readarray -t array < <(sed -n '/{/,/}/{s/[^:]*:[^"]*"\([^"]*\).*/\1/p;}' json2)
これは、コメントでも言及されている、グロビングの問題も処理します。