我想在JSON文件中搜索一些键或值,并在找到它的位置打印它。
例如,当使用jq
打印我的Firefox的extensions.json时,我得到了类似的信息(在这里使用“ ...”跳过较长的部分:]
{
"schemaVersion": 31,
"addons": [
{
"id": "[email protected]",
"syncGUID": "{e6369308-1efc-40fd-aa5f-38da7b20df9b}",
"version": "2.0.0",
...
},
{
...
}
]
}
说我想搜索“ [email protected]”,并且想要一个输出,向我显示在哪里找到这样的东西:
{ "addons": [ {"id": "[email protected]"} ] }
有没有一种方法可以通过jq
或其他一些json工具来获得它?
我还试图简单地列出该文件中的各个id
,希望我可以将其与jq '.id'
一起使用,但只是返回了null
,因为它显然需要完整的路径。
换句话说,我正在寻找可以以类似于Xpath工具的方式使用的命令行json解析器
path()
函数派上用场:
$ jq -c 'path(.. | select(. == "[email protected]"))' input.json
["addons",0,"id"]
结果路径被解释为“在初始对象的addons字段中,第一个数组元素的id字段匹配”。您可以将其与getpath()
,setpath()
,delpaths()
等一起使用,以获取或操作其描述的值。
使用示例进行修改以使其成为有效的JSON:
< input.json jq -c --arg s [email protected] '
paths as $p | select(getpath($p) == $s) | null | setpath($p;$s)'
产生:
{"addons":[{"id":"[email protected]"}]}
如果到给定值有N条路径,则上面将产生N条线。如果只需要第一个,则可以将所有内容包装在first(...)
中。
"id"
值我也试图简单地列出该文件中的各种ID
假设"id"
和false
的null
值不重要,您可以使用jq过滤器打印所有感兴趣的“ id”值:
.. | .id? // empty