我试图找出如何使用 jq 删除出现在数组中架构中任何位置的某个值。
在这种情况下,我试图从标记为代理的字段下方的数组内的任何位置删除 agent4。
这是我到目前为止
jq '..|.agents? | select(. != null) | map(select(. != "agent4"))'
但这只会创建更改的数据,我不知道如何将其重新分配给路径。
我最初尝试为此使用 sed,但它绝对不是要使用的工具,所以我切换到 jq。
{
"environments": {
"default": {
"machines": {
"dev-machine": {
"agents": [
"agent1",
"agent2",
"agent3",
"agent4"
]
}
}
}
},
"environments2": {
"agents": [
"agent1",
"agent2",
"agent3",
"agent4"
]
}
}
然而这只是输出
[
"agent1",
"agent2",
"agent3"
]
[
"agent1",
"agent2",
"agent3"
]
最佳答案
这是使用 walk
的解决方案:
walk( if type == "object" and has("agents")
then .agents |= map(select(. != "agent4"))
else . end )
如果要从所有数组中删除该值,无论它们出现在何处:
walk( if type == "array" then map(select(. != "agent4")) else . end )
如果您想要更灵活的解决方案,例如,您可以替换
"agent4"
来自 $value
,然后设置 $value
在命令行上,例如使用 --arg value VALUE
如果 VALUE 是一个字符串,或者 --argjson value VALUE
作为适当的。如果您的 jq 没有
walk
, 简单地加上它的定义,它可以(例如)从 https://github.com/stedolan/jq/blob/master/src/builtin.jq 获得
关于arrays - jq 递归删除出现在架构中任意位置的数组中的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47204952/