【问题标题】:How to use jq wildcardjq通配符的使用方法
【发布时间】:2019-10-14 18:51:40
【问题描述】:

我有以下 json :

{  
   "details":{  
      "car": "bmw",
      "addresses":{  
         "ext-118-21-8-0-29":[  
            {  
               "version":4,
               "addr":"89 Psr"
            },
            {  
               "version":6,
               "addr":"56 apT"
            }
         ]
      }
   }
}

ext-118-21-8-0-29 是动态的,下次会更改,我不知道确切的值,这就是我需要使用通配符的原因。我需要获取密钥addr 的值,其中版本为4

我期待输出89 Psr

我使用函数startswith()尝试了以下操作。

jq '.detail.addresses | select(startswith("ext"))'

但它以错误结束。

jq: error (at :0): startswith() 需要字符串输入

【问题讨论】:

    标签: json select key jq wildcard


    【解决方案1】:

    如果按照部分问题的建议,您希望将搜索限制为以“ext”开头的键名:

    .details.addresses
    | to_entries[]
    | select(.key|startswith("ext"))
    | .value[]
    | select(.version == 4)
    | .addr
    

    走向宽容范围的另一端:

    .details.addresses
    | ..
    | objects
    | select(.version==4)
    | .addr
    

    【讨论】:

      【解决方案2】:

      如果您不关心正在搜索的对象中的键,您可以使用 [] 搜索对象的值,然后您可以过滤到您想要的结果。

      .details.addresses[][] | select(.version == 4).addr
      

      另一方面,如果您想选择版本 4 的密钥,您可以使用 to_entries 来执行此操作:

      .details.addresses | to_entries[] | select(any(.value[]; .version == 4)).key
      

      【讨论】:

      • 我有一个问题,代码保留双引号",我有"89 Psr"作为结果字符串
      • 添加-r 开关以获得原始输出。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-08-22
      • 1970-01-01
      • 2013-10-01
      • 2014-12-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多