如何使用Bash在json文件中查找内容

问题描述 投票:1回答:2

我想在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解析器

json jq
2个回答
3
投票

path()函数派上用场:

$ jq -c 'path(.. | select(. == "[email protected]"))' input.json
["addons",0,"id"]

结果路径被解释为“在初始对象的addons字段中,第一个数组元素的id字段匹配”。您可以将其与getpath()setpath()delpaths()等一起使用,以获取或操作其描述的值。


0
投票

使用示例进行修改以使其成为有效的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"falsenull值不重要,您可以使用jq过滤器打印所有感兴趣的“ id”值:

.. | .id? // empty
© www.soinside.com 2019 - 2024. All rights reserved.