[英]in place edit, search for nested value and then replace another value
我有一個輸入JSON文檔,其格式大致如下(實際數據具有其他鍵,應通過未修改的鍵進行傳遞;空白已針對人類可讀性進行了調整,並且不希望保留它):
{
"Rules": [
{"Filter": { "Prefix": "to_me/" }, "Status": "Enabled" },
{"Filter": { "Prefix": "from_me/" }, "Status": "Enabled" },
{"Filter": { "Prefix": "__bg/" }, "Status": "Enabled" }
]
}
我需要匹配.Rules[].Filter.Prefix=="to_me/"
,然后將關聯的"Status": "Enabled"
更改為"Disabled"
。 由於僅上面的第一個規則的前綴為to_me/
,因此該規則的狀態將更改為Disabled
,從而使正確的輸出如下所示:
{
"Rules": [
{"Filter": { "Prefix": "to_me/" }, "Status": "Disabled" },
{"Filter": { "Prefix": "from_me/" }, "Status": "Enabled" },
{"Filter": { "Prefix": "__bg/" }, "Status": "Enabled" }
]
}
我嘗試了幾種不同的組合,但似乎無法正確完成。
有人有主意嗎?
我更喜歡成語ARRAY |= map(...)
不是ARRAY[] |= ...
,主要是因為無論替換項是否為empty
都可以可靠地使用前者:
jq '.Rules |= map(if .Filter.Prefix == "to_me/"
then .Status="Disabled" else . end)'
要覆蓋輸入文件,您可能需要考慮moremutils中的 sponge
。
可以使用|=
進行就地更新,並且可以使用if / then / else決定是否就地修改內容。 從而:
jq '.Rules[] |= (if .Filter.Prefix == "to_me/" then .Status="Disabled" else . end)'
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.