如何使用jq查找某个键的所有路径
问题描述:
在非常大的嵌套json结构中,我试图找到所有以键结尾的路径。如何使用jq查找某个键的所有路径
例如:
{
"A": {
"A1": {
"foo": {
"_": "_"
}
},
"A2": {
"_": "_"
}
},
"B": {
"B1": {}
},
"foo": {
"_": "_"
}
}
将打印线沿线的东西: [ “A”, “A1”, “富”],[ “富”]
不幸的是我不知道在什么级别的嵌套键会出现,所以我一直没有能够找出一个简单的选择。我已经接近jq '[paths] | .[] | select(contains(["foo"]))'
,但输出包含任何包含foo的树的所有排列。 输出:["A", "A1", "foo"]["A", "A1", "foo", "_"]["foo"][ "foo", "_"]
如果我可以保留原始数据结构格式,但只是过滤掉所有不含密钥的路径(在这种情况下,“foo”下的子树不需要隐藏)。
答
有了您的输入:
$ jq -c 'paths | select(.[-1] == "foo")'
["A","A1","foo"]
["foo"]
加分点:
(1)如果你的JQ有tostream
:
$ jq 'fromstream(tostream| select(.[0]|index("foo")))'
或者更好的,因为你的投入很大,你可以使用带有此过滤器的流解析器(jq -n --stream
):
fromstream(inputs|select((.[0]|index("foo"))))
(2)无论您的JQ有tostream
:
. as $in
| reduce (paths(scalars) | select(index("foo"))) as $p
(null; setpath($p; $in|getpath($p))))
在所有这三种情况下,输出是:
{
"A": {
"A1": {
"foo": {
"_": "_"
}
}
},
"foo": {
"_": "_"
}
}
如何用'endswith'更换'contains'? –