2015-04-12 27 views
5

在我的JSON中搜索和替換時遇到困難我一直在試圖讓這個工作好幾天,但我被卡住了。使用jq

我有一個json數據結構,其中包含我想要更新的數據結構,基本上使用我的json作爲數據庫來存儲配置值。這裏是我的JSON:

{ 
    "Actions": [ 
    { 
     "Number": 1012, 
     "RollbackPoint": "xxx_1012_RollbackPoint_xxx", 
     "Parameters": [ 
     { 
      "Name": "accountType", 
      "Value": "xxx_1012_accountType_xxx" 
     }, 
     { 
      "Name": "userPassword", 
      "Value": "xxx_1012_userPassword_xxx" 
     } 
     ] 
    }, 
    { 
     "Number": 1015, 
     "RollbackPoint": "xxx_1015_RollbackPoint_xxx", 
     "Parameters": [ 
     { 
      "Name": "accountType", 
      "Value": "xxx_1015_accountType_xxx" 
     }, 
     { 
      "Name": "skipExport", 
      "Value": "xxx_1015_skipExport_xxx" 
     } 
     ] 
    } 
    ] 
} 

我想執行兩個更新

  1. 更新RollbackPoint爲 「1012」,其中數= 1015
  2. 更新值 「AWS」,其中name = 「ACCOUNTTYPE」 下參數,其中number = 1012

到目前爲止,我已經到了最接近的是使用這樣的:

cat json.txt | jq '.[] | map(. + {RollbackPoint:(if (."Number") == 1015 then "1015" else .RollbackPoint end)})' 

但這剝去操作[]元素所以它不適合我,我不知道在哪裏甚至更新2開始...

任何幫助將不勝感激,超過5小時谷歌和我仍然沒有附近。

非常感謝 馬特

回答

8

您可以使用//運營商的模仿(恕我直言)更好的if-else樹與各種過濾過濾器結合使用。與大型的if-else樹相比,它使得它很容易遵循。

.Actions |= map(
    (select(.Number == 1015) | 
     .RollbackPoint = "1012" 
    ) // 
    (select(.Number == 1012) | 
     .Parameters |= map((select(.Name == "accountType") | .Value = "AWS") // .) 
    ) // 
    . 
) 
+0

完美! 非常感謝你,傑夫工作的魅力。我現在可以看到我在這個地方使用它。 親切的問候 馬特 – msmithwr

+0

@msmithwr很高興你找到你的解決方案。請將Jeff的答案標記爲已接受,以幫助其他用戶。 – Synesso

0

這裏是另一個JQ解決

.Actions[] |= (
     if .Number == 1015 then .RollbackPoint = "1012" else . end 
    | if .Number == 1012 then .Parameters[] |= (
     if .Name == "accountType" then .Value = "AWS" else . end 
    ) else . end 
)