簡體   English   中英

就地編輯,搜索嵌套值,然后替換另一個值

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM