2016-03-22 11 views
3

jqを使用してJSONオブジェクトのキーのセット(変数で定義)の値を変更する必要があります。jqを使用してキーの配列に基づいてJSON値を変更します

{ 
    foo: { 
     bar: 1, 
     baz: 2, 
     qux: 3 
    } 
} 

と次の変数:

update_keys = ["bar", "baz"] 
私は 'Xにupdate_keysのキーの値を変更' 言いたい

は一例として、私はこのJSONオブジェクトを持っています。

次作品:

.foo = (.foo | 
     to_entries | 
     map(if .key == "bar" or .key == "baz" 
     then . + { "value":"X" } 
     else . 
     end) | 
     from_entries) 

しかし、その代わりのif .key == "bar" or .key == "baz"私はif .key in update_keysを言うための方法、または同様のロジックを探しています。

+0

結果をどのようにすべきかを詳しく説明できますか? update_keysを拡張するか、変更するかはわかりません。foo –

+0

update_keys配列で定義されているキーの値を変更してfooを更新したい(全てのキーが同じ値に変わる) – fusio

+0

'update_keys'はすでに' jq'で定義した変数ですか? –

答えて

1

ここに行きます。

フィルター

.foo |= with_entries(.value = if ([.key] | inside(["bar", "baz"])) then "X" else .value end) 

入力

{ 
    "foo": { 
     "bar": 1, 
     "baz": 2, 
     "qux": 3 
    } 
} 

出力

{ 
    "foo": { 
    "bar": "X", 
    "baz": "X", 
    "qux": 3 
    } 
} 

よりrecipiesのための料理の本をチェックそしてjq使い方のテクニック:
https://github.com/stedolan/jq/wiki/Cookbook

+0

ああ、ありがとう:D – fusio

0
ここ

update_keysをパラメータ化する--argjsonを使用して、わずかに異なるアプローチだ、とindex/1

$ cat update.jq 
.foo |= with_entries(. as $in 
      | if $update_keys | index($in.key) then .value = "X" else empty end) 

$ update_keys='["bar", "baz"]' 

$ jq --argjson update_keys "$update_keys" -f update.jq input.json 

Output: 

{ 
    "foo": { 
    "bar": "X", 
    "baz": "X" 
    } 
} 
0

$update_keys以来、この問題では必要とされていることすべてが

あるだけ配列です
.foo[ $update_keys[] ] = "X" 

["bar","baz"] as $update_keys 
| .foo[ $update_keys[] ] = "X" 

filter.jqにあり、data.jsonが、その後

jq -M -f filter.jq data.json 

{ 
    "foo": { 
    "bar": "X", 
    "baz": "X", 
    "qux": 3 
    } 
} 

を生成

{ 
    "foo": { 
    "bar": 1, 
    "baz": 2, 
    "qux": 3 
    } 
} 

(slighty訂正)のデータが含まれている場合は、PAにしたい場合あなたのスクリプトでそれを定義するのではなく、更新キーの値にssを設定すると、--argjsonpeakの回答が示すように簡単に使うことができます。

関連する問題