如何使用 JQ 从 JSON 中删除不需要的项目?

How to remove unnecessary items from an JSON with JQ?

我需要这个:(示例)

{
  "jobs": [
      {},
      {}
    ],
  "services": {
    "service-1": {
      "version": "master"
    },
    "service-2": {
      "foo": true,
      "version": "master"
    },
    "service-3": {
      "bar": "baz"
    }
  }
}

做这个:

{
  "services": {
    "service-1": {
      "version": "master"
    },
    "service-2": {
      "version": "master"
    }
  }
}

所以删除除.services.*.version以外的所有内容。请帮忙,以我对JQ的了解无法处理。

如果您想区分“版本”不存在或为空:

{services}
| .services |= map_values(select(has("version")) | {version} )

非常笼统地翻译您的表达式 .services.*.version,您可以按如下方式使用 tostream

reduce (tostream
        | select(length==2 and
                 (.[0] | (.[0] == "services" and
                          .[-1] == "version")))) as $pv (null;
    setpath($pv[0]; $pv[1]) )

使用 jq 的流解析器

为了减少内存需求,您可以修改上述解决方案以使用 jq 的流解析器,如上 reducefromstream:

jq -n --stream -f program.jq input.json

其中 program.jq 包含:

fromstream(inputs
    | select( if length == 2
              then .[0] | (.[0] == "services" and
                           .[-1] == "version")
              else . end ) )

.services.*.version.*

更广泛地解释 .services.*.version,以便不要求路径的终端组件是 .version,只需替换 .[-1] == "version" 有:

index("version")

在上面。