shell 如何使用jq更改JSON中的多个值,通过键选择它们并获得整个JSON输出

sr4lhrrt  于 2023-06-30  发布在  Shell
关注(0)|答案(2)|浏览(317)

我有下面的data.json要修改,我想根据过滤的IP地址范围(例如“10.13 *”)将状态更改为“禁用”。我尝试了以下命令,我需要得到整个JSON内容作为输出,但我得到了一个语法错误(我已经使用相同的更新单个值(不使用字符Map),它工作得很好。(计划是在shell命令中使用此命令并将输出重定向到新文件)。有人能帮我一下吗

jq '(.[]| select(.node|test("^10.13*"))).state |="disabled" data.json
[
    {
        "node":"10.13.248.254:61052",
        "state": "active"
    },
    {
        "node":"10.13.248.255:61052",
        "state": "active"
    },
    {
        "node":"10.54.247.228:61052",
        "state": "active"
    },
    {
        "node":"10.54.247.229:61052",
        "state": "active"
    }
]
wb1gzix0

wb1gzix01#

你的正则表达式不太对。此外,使用map使事情变得更简单可能是值得的:

map(if (.node|test("^10[.]13[.]")) then .state="disabled" else . end)

或者你可以简单地使用startswith
关于后续问题:
如果你的数组位于{"properties": { "basic": {"nodes_table": _}}}中的_,你会写:

.properties.basic.nodes_table |= map(....)
dbf7pr2w

dbf7pr2w2#

如果你只想修改IP地址以“10.13.”开头的数组元素,你通常会使用map并与startswith合并(用于前缀匹配IP地址):

jq 'map(select(.node|startswith("10.13.")).state = "disabled")' input.json

一次分配多个值的等效解决方案:

jq '(.[]|select(.node|startswith("10.13")).state) = "disabled"' input.json

请注意,第二个解决方案与您提出的方案几乎相同(略有修改:不同的分组、startswith和普通赋值运算符)

相关问题