就地编辑,搜索嵌套值,然后替换另一个值

时间:2018-12-21 00:45:37

标签: json jq inplace-editing

我有一个输入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" }
    ]
}

我尝试了几种不同的组合,但似乎无法正确处理。

有人有想法吗?

2 个答案:

答案 0 :(得分:1)

相对于ARRAY |= map(...),我更喜欢成语ARRAY[] |= ...,这主要是因为无论替换项是否评估为empty,前者都可以可靠地使用:

jq '.Rules |= map(if .Filter.Prefix == "to_me/" 
                  then .Status="Disabled" else . end)'

要覆盖输入文件,您可能要考虑使用moremutils中的sponge

答案 1 :(得分:0)

可以使用|=完成就地更新,而可以通过if / then / else决定是否就地修改内容。因此:

jq '.Rules[] |= (if .Filter.Prefix == "to_me/" then .Status="Disabled" else . end)'