2016-12-28 9 views
0

間の部分文字列を抽出する私は、たとえば、文字列としてJSONオブジェクトが含まれている変数を持っている:bashで2つのストリング

{"results":[{"Name":"blah-1","Version":"1.0"},{"Name":"Some Other Name","Version":"2b-alpha"}]}

私はcurlへの呼び出しからこれを得ました。

私はprintf '%s\n' "${versions[@]}"を呼び出すとき、それはラインによって各バージョン文字列の行を出力するように、bashの配列にバージョン文字列を取りに行くとします

1.0 
2b-alpha 

これらのバージョン文字列の出現箇所の任意の量が存在することができJSONで私はこれをどうやって行うのですか?純粋なbashで行うことができますか?grepまたはsedが必要ですし、コマンドはどのように見えますか?

+1

jsonを解析する場合は、jsonパーサーを使用します。あなたがそれを十分に長い間考えているなら、それは理にかなっていて理にかなっています。 –

+0

'json'を解析するのに' jq'を使う – Inian

答えて

2

gniourf-gniourfは、使用することを示唆しているとより良い保守性のために、適切なJSONパーサ、例えば、jqを解析します。アイデアはjqフィルタ.results[] | "\(.Version)"ある結果の下にあるすべてのノードを選択し、その下にVersionのすべての名前を抽出し

1.0 
2b-alpha 

として内容を印刷する必要があります

$ echo "$jsonString" | jq -r '.results[] | "\(.Version)"' 

ような何かを行います。

は、アレイの使用などprocess-substitutionにそれを保存し、

read -r -a jsonArray < <(echo "$jsonString" | jq -r '.results[] | "\(.Version)"') 

とダウンロードの手順については、GitHub-jq-documentationページを参照してください

printf '%s\n' "${jsonArray[@]}" 

として、配列の内容を印刷します。

+1

'.results []。Version 'を使うことができます – hek2mgl

-1

一つの方法:xは、あなたの文字列が格納されている変数をある

arr=($(echo "$x" | grep -oP '(?<="Version":")[^"]+')) 

o - 文字列 Pの一部だけを抽出する - perlのような正規表現を使用するように、我々は

後ろにポジティブな外観を使用しているあなたは好きそれにアクセスすることができます。

printf '%s\n' "${arr[@]}" 
1

バージョン番号が必要な場合は、curlの結果を変数に格納する必要はありません。 curlの結果をjqに直接パイプすることができます。

versions=($(curl 'http://server/path' | jq -r '.results[].Version')) 
関連する問題