如何使用 JQ 删除所有嵌套键

Posted

技术标签:

【中文标题】如何使用 JQ 删除所有嵌套键【英文标题】:How to delete all nested keys with JQ 【发布时间】:2017-03-14 16:10:39 【问题描述】:

我想从一个 npm shrinwrap json 文件中删除所有的 resloved。这会导致在其他机器上运行 npm install 时出现问题。

 "cssstyle": 
      "version": "0.2.37",
      "from": "cssstyle@>=0.2.29 <0.3.0",
      "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-0.2.37.tgz"
    ,
    "dashdash": 
      "version": "1.14.0",
      "from": "dashdash@>=1.12.0 <2.0.0",
      "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.0.tgz",
      "dependencies": 
        "assert-plus": 
          "version": "1.0.0",
          "from": "assert-plus@>=1.0.0 <2.0.0",
          "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz"
        
      
    ,
    "debug": 
      "version": "2.2.0",
      "from": "debug@>=2.2.0 <3.0.0",
      "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz"
    

如何从所有文件中删除已解析的密钥

我正在使用该模式:

jq 'del(.resolved)' file.json

【问题讨论】:

【参考方案1】:

在我看来,解决这类问题最简单的方法是使用walk/1

walk(if type == "object" and has("resolved") then del(.resolved) else . end)

如果您的 jq 没有 walk/1(仅在 jq 1.5 发布后作为内置函数包含在内),则只需在上述行之前添加其定义(可在网络上轻松获得),或者将其包含在你的 ~/.jq 文件。

【讨论】:

在 jq 术语中,它是一个过滤器,就像您提供的过滤器一样。您可以像以前一样在命令行中提供它,或者将它放在一个文件中并使用 -f 选项调用 jq。 如何添加WALK? 在 1.6 发布之前,您可以从源代码github.com/stedolan/jq/tree/jq-1.6rc1 下载并安装它,并按照自述文件中的说明进行安装 使walk 可用的最简单方法是将其def 包含在您的程序中。有关其定义和更多详细信息,请参阅github.com/stedolan/jq/wiki/FAQ。 def 也可以从raw.githubusercontent.com/stedolan/jq/master/src/builtin.jq 获得 请注意 has("resolved") 是不必要的。似乎 jq 只会尝试删除,如果不能,则不会发生任何不好的事情。如果您需要删除多个内容,可能会派上用场

以上是关于如何使用 JQ 删除所有嵌套键的主要内容,如果未能解决你的问题,请参考以下文章

如何删除除 jq 之外的所有键?

Jq:递归删除与给定模式匹配的所有键

如何使用 jq 将此嵌套对象转换为扁平对象?

使用 jq 将嵌套的 JSON 文件分解为具有唯一键的平面列表

使用 jq 保留键名展平 JSON

如何从Rails中的哈希列表中删除嵌套键