2017-03-15 9 views
1

私は同じ一般的な前提で私が見つけることができるほぼすべての質問を読んできましたが、私は3回近く近づいてきましたが、私はこの作業を行うことができません。jqを使ってJSONファイルに新しい鍵ペアを追加

parameters.jsonと呼ばれるJSONファイルがあり、そのようなキーペアがあるとします。 (共有のために短縮)

[ 
    { 
    "ParameterKey": "Foo1", 
    "ParameterValue": "Bar1" 
    }, 
    { 
    "ParameterKey": "Foo2", 
    "ParameterValue": "Bar2" 
    } 
] 

私はだから私は

[ 
    { 
    "ParameterKey": "Foo1", 
    "ParameterValue": "Bar1" 
    }, 
    { 
    "ParameterKey": "Foo2", 
    "ParameterValue": "Bar2" 
    }, 
    { 
    "ParameterKey": "Foo3", 
    "ParameterValue": "Bar3" 
    } 
] 

ユースケース&試み

のようなファイルで終わる

{ 
    "ParameterKey": "Foo3", 
    "ParameterValue": "Bar3" 
    } 

を言って、別のキーペアを追加します

私はAWSのパラメータファイルをコピーして更新するbashスクリプトを書いています - これはwheです鍵ペアが入ってきます。既存のファイルをコピーするときに、新しい鍵ペアを追加する必要があります。私はif/thenをうまくやることができます。それは物理的に新しい鍵ペアを追加しています。私は、私は本当にそれだけで罰金鍵ペアを生成しながら、理解していないこの不格好な回避策は、になってしまったグーグルのトンで

は、parameters.jsonに戻し、それを追加しません

item='{"ParameterKey": "RTSMSnapshotID"}' 

jq --argjson item "$item" '$item + {"ParameterValue": ""}' parameters.json 

私はキーペアがコマンドラインで正しく私に印刷されるので、私は| sponge parameters.jsonを追加すると思っていますが、空のファイルを返します。

また、ファイルの最後の行を削除して新しい鍵ペア(とEOF)を追加するsed回避策も考えましたが、もちろんsedは改行でうまく動かず、うまく動作しません。

私は、bashのものとjqのものを使用するソリューションにはオープンしています。私はまだbash/jq noobですので、詳細な説明が分かります。

答えて

2

argjsonを使用するという考えは正しいですが、構文が++=の演算子の詳細については、jq-documentationを確認jq-1.5

jq --argjson obj '{ "ParameterKey": "Foo3", "ParameterValue": "Bar3" }' '. + [$obj]' < json 
[ 
    { 
    "ParameterKey": "Foo1", 
    "ParameterValue": "Bar1" 
    }, 
    { 
    "ParameterKey": "Foo2", 
    "ParameterValue": "Bar2" 
    }, 
    { 
    "ParameterKey": "Foo3", 
    "ParameterValue": "Bar3" 
    } 
] 

に以下の通りです。あなたはJSON配列を持つ一つのファイルがある場合(parameters.jsonを言う)

jq自身でこれを行う方法を知っていないですが、あなたはこれを行うにはきちんとbashトリックを使用することができ、

jq --argjson obj '{ "ParameterKey": "Foo3", "ParameterValue": "Bar3" }' '. + [$obj]' <json> temp && mv temp json 
+0

これは新しいキーペアを期待通りに追加しますが(感謝!)、出力をコマンドラインに出力します。それを 'parameters.json'にパイプで戻す方法は? – Alex

+1

jq FAQページ(https://github.com/stedolan/jq/wiki/FAQ)で、-i – peak

+1

を検索してください。誰かがこれを使用する必要がある場合に備えて、 '| sponge parameters.json'を使用して簡単に回避することができます。 – Alex

1

、1つ目のファイルに配列に追加するJSONエンティティを含む1つ以上の追加ファイル(file * .jsonなど)と、最初のファイルを上書きする場合は、 1.5以上:

$ jq 'reduce inputs as $in (.; . + [$in])' parameters.json file*.json | 
    sponge parameters.json 

メモthこの方法を使用すると、各補助ファイルの各トップレベルJSONエンティティが配列に別々に追加されます。

これは少し気が利いているのは、ここでinputsが-nオプションなしで使用されているということです。

あなたがbashを言及しているので、「ファイル*の.json」ソースのいずれかのプロセスがある場合、あなたは<(...)を使用するのではなく、ファイル名を指定することができることに注意してください、例えば:

$ jq 'reduce inputs as $in (.; . + [$in])' parameters.json <(curl -Ss ...) | 
    sponge parameters.json 

あなたはドン場合

jq ..... > OUT && mv IN OUT 
+0

私は具体的には中間ファイルのないソリューションが必要でした.Jenkinsではこのプロセスが発生し、ファイルが関与すると直ちにワークスペースが煩雑になるか、git checkoutsが必要になります。しかし、私は答えを高く評価しているので、私はアップアップしています。異なるユースケースを持つ他の人には役に立ちます。 – Alex

+0

@Alex <(...)を使用できますか? – peak

関連する問題