Bash
使用 jq 更新包含具有特定值的其他屬性的對象的屬性
使用 jq,是否可以使用其他屬性更新具有特定值的對象的值?
在下面的範例中,我想設置所有具有“keyname”=“foo”的對象的“value”屬性的值。
.json 文件如下所示:
"root" : "instances": [ { "name": "1", "configs": [ { "keyname": "foo", "value": "" // <- update/set this }, { "keyname": "barrr" "value": "barrrr" } ] }, { "name": "2" "configs": [ { "keyname": "foo", "value": "" // <- update/set this }, { "keyname": "buzzz", "value": "buzzz" } ] } ]
我試過了,但徒勞無功,我收到一個關於數組不是字元串的錯誤:
jq '(.root.instances.configs[] | select(.keyname==foo)).value = foo'
假設您的 JSON 文件格式正確,您顯示的範例不是因為它包含多個問題:
$ cat file { "root": { "instances": [ { "name": "1", "configs": [ { "keyname": "foo", "value": "" }, { "keyname": "barrr", "value": "barrrr" } ] }, { "name": "2", "configs": [ { "keyname": "foo", "value": "" }, { "keyname": "buzzz", "value": "buzzz" } ] } ] } }
$ jq '( .root.instances[].configs[] | select(.keyname == "foo") ).value |= "foo"' file { "root": { "instances": [ { "name": "1", "configs": [ { "keyname": "foo", "value": "foo" }, { "keyname": "barrr", "value": "barrrr" } ] }, { "name": "2", "configs": [ { "keyname": "foo", "value": "foo" }, { "keyname": "buzzz", "value": "buzzz" } ] } ] } }
此
jq
表達式將.value
鍵的值更新為字元串foo
。更新的密鑰是從 中的條目之一中選擇的.root.instances[].configs[]
。請注意,這.root.instances
是一個數組,其每個.configs
元素中的每個條目也是一個數組。該select()
語句.keyname
使用字元串測試密鑰foo
。製作查詢鍵和新值變數的方法如下:
jq --arg querykey 'foo' \ --arg newval 'The train said "choo choo"' \ '( .root.instances[].configs[] | select(.keyname == $querykey) ).value |= $newval' file
這將創建兩個名為和的內部
jq
變數。它們的值將被正確編碼,因此例如可以包含雙引號,如上所示。$querykey``$newval``$newval