我正在试图了解如何使用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"
]发布于 2017-11-09 15:44:07
这里有一个使用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 )如果您想要更灵活的解决方案,可以使用$value替换$value,然后在命令行上设置$value,例如,如果值是字符串,则使用--arg value VALUE,或者根据需要使用--argjson value VALUE。
如果您的jq没有walk,只需将其定义放在前面,这是可以从https://github.com/stedolan/jq/blob/master/src/builtin.jq获得的(例如)
发布于 2017-11-09 15:38:26
下面是一个使用路径查找"agent4“并验证它在”代理“中出现的解决方案,然后再用三角路径删除它
delpaths([ path(..|select(.=="agent4")) | select(.[-2]=="agents") ])示例运行(假设数据在data.json中)
$ jq -M 'delpaths([ path(..|select(.=="agent4")) | select(.[-2]=="agents") ])' data.json
{
"environments": {
"default": {
"machines": {
"dev-machine": {
"agents": [
"agent1",
"agent2",
"agent3"
]
}
}
}
},
"environments2": {
"agents": [
"agent1",
"agent2",
"agent3"
]
}
}下面是另一种使用reduce、路径、吸气路径和三角路径的方法:
reduce leaf_paths as $p (.;
if $p[-2]=="agents" and getpath($p)=="agent4" then delpaths([$p]) else . end
)https://stackoverflow.com/questions/47204952
复制相似问题