Bash

使用 jq 更新包含具有特定值的其他屬性的對象的屬性

  • December 3, 2021

使用 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

引用自:https://unix.stackexchange.com/questions/680004