如何使用 jq 将树中的某个匹配节点替换为从根节点到该节点的路径?
使用walk
,只能访问从当前节点向下树的路径:
https://jqplay.org/s/BVOQ-xa1JM :
walk(if type == "object" and has("d") then .d = path(.) else . end)
输入:
{"a": {"b": 1, "c": {"d": 2}}, "e": {"d}
结果:
{
"a": {
"b": 1,
"c": {
"d": []
}
},
"e": {
"d": []
}
}
期望的结果是:
{
"a": {
"b": 1,
"c": {
"d": ["a", "c"]
}
},
"e": {
"d": ["e"]
}
}
注意:这不能导致整个树的重复,如下所示:
(paths | select(.[-1] == "d")) as $f | setpath($f; $f[:-1])
原因:
{
"a": {
"b": 1,
"c": {
"d": [
"a",
"c"
]
}
},
"e": {
"d": 3
}
}
{
"a": {
"b": 1,
"c": {
"d": 2
}
},
"e": {
"d": [
"e"
]
}
}
最佳答案
您的预期输出不正确,因为 b
不涉及从根开始的 d
的向下路径。您可以在 --null-input
模式下使用涉及 setpath()
的 paths
函数,即使用 jq -n
( inputs | paths | select(.[-1] == "d")) as $f | setpath($f; $f[:-1])
这个想法是在变量 $f
中构建直到 d
的路径 channel ,并使用 set path 函数在其上设置值。 [:-1]
部分修剪数组中离开叶节点的最后一个条目。
关于arrays - 用节点替换 jq 中从根开始的路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68371453/