【问题标题】:jq Recursive search values by key, starting withjq 按键递归搜索值,以
【发布时间】:2020-12-17 09:29:24
【问题描述】:

TL;DR

下面的命令中相当于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文件比较大,有很多不相关的数据

我正在尝试捕获 json 文件中的所有 .pattern based on this question 我创建了以下 jq 命令:

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

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

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

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

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

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


Google 教了我关于 jq 的 contains 这似乎是某种相关问题的答案;

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

【问题讨论】:

    标签: jq grep json jq


    【解决方案1】:

    要执行选择,您可以使用

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

    于是命令变成了;

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

    或者与startswith类似。

    【讨论】:

    • 感谢您的回答!您能否提供一个完整的命令示例?
    • @0stone0: pete 表示将它与您的原始模式一起使用 - .. .pattern? // empty | select( test( "^/v6/" ) )
    • 知道使用select 是唯一的选择吗?不能只使用test
    • def grep($s): select(test($s));
    猜你喜欢
    • 2016-11-22
    • 2013-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-27
    相关资源
    最近更新 更多