如何使用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”下的子树不需要隐藏)。

+0

如何用'endswith'更换'contains'? –

有了您的输入:

$ 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": { 
    "_": "_" 
    } 
}