我有一个输入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" }
]
}
我尝试了几种不同的组合,但似乎无法正确处理。
有人有想法吗?
答案 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)'