首页 > 解决方案 > jq 按键递归搜索值,以

问题描述

TL;博士

以下命令中的等价于什么;grep '"\/v6'

jq '.. .pattern? // empty' /tmp/all.json | grep '"\/v6'

考虑以下json;

{
  "payload": {
    "groups": [
      {
        "pattern": "/v6/",
        "groups": [
          {
            "pattern": "something/",
            "groups": [
              {
                "pattern": "somethingElse/",
                "groups": [
                  {
                    "pattern": "{specialPattern:[0-9]+}/",
                    "groups": [],
                    "routes": [
                      {
                        "type": "variable",
                        "pattern": "/v6/notImportant/{specialPattern:[0-9]+}/",
                        "methods": {

json文件很大,有很多不相关的数据

我正在尝试捕获.patternjson 文件中的所有内容,基于这个问题,我创建了以下 jq 命令:

jq '.. .pattern? // empty' /tmp/all.json

这按预期工作,创建与此类似的输出;

"/v6/"
"something/"
"somethingElse/"
"{specialPattern:[0-9]+}/"
"/v6/notImportant/{specialPattern:[0-9]+}/"

问题:我如何选择.pattern以 开头的每个/v6/?我像这样使用过

jq '.. .pattern? // empty' /tmp/all.json | grep '"\/v6'

但是,必须有一个jq-only 解决方案。


谷歌教了我关于 jq 的知识contains,这似乎是某种相关问题的答案;

不幸的是,我无法使其适用于我的情况,因为select似乎没有必要使用。

标签: jsonjq

解决方案


要执行选择,您可以使用

select( test( "^/v6/" ) )

所以命令变成了;

jq '.. .pattern? // empty | select(test("^/v6/"))' /tmp/all.json

或与startswith.


推荐阅读