0

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

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

有人有想法吗?

4

2 回答 2

1

我更喜欢这个成语ARRAY |= map(...)ARRAY[] |= ...主要是因为前者可以可靠地使用,无论是否有任何替换计算为empty

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

要覆盖输入文件,您可能需要考虑spongemoremutils 。

于 2018-12-21T01:21:48.967 回答
0

可以使用 进行就地更新|=,并且可以使用 if/then/else 决定是否就地修改内容。因此:

jq '.Rules[] |= (if .Filter.Prefix == "to_me/" then .Status="Disabled" else . end)'
于 2018-12-21T00:59:12.233 回答