如何使用jq通配符

时间:2019-05-29 08:07:30

标签: json key wildcard jq

我有以下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:错误(在:0处):startswith()需要字符串输入

3 个答案:

答案 0 :(得分:2)

如果您不关心要搜索的对象中的键,则可以使用[]搜索对象的值,然后将其过滤到所需的结果。

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

另一方面,如果您想选择具有版本4的键,则可以使用to_entries进行此操作:

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

答案 1 :(得分:1)

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

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

向宽容的另一端:

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

答案 2 :(得分:-1)

或者,您也可以使用基于步行路径的UNIX实用程序 jtc

bash $ <file.json jtc -w'[version]:<4>d [-1] [addr]' -qq
89 Psr
bash $ 

解释步行路径(-w)参数:

  • [version]:<4>d-递归查找编号为4的数字version的第一次出现
  • [-1]将解决找到的JSON条目的父级(在上一个步骤中)
  • [addr]将通过标签addr处理找到的JSON条目(在上一步中)

-qq是将引号引起来的选项(否则将显示为JSON字符串-"89 Psr"

最后,如果您想确保搜索仅限于键以ext开头的记录,请使用以下遍历路径:-w'<^ext>L[version]:<4>d[-1][addr]'

  • <..>L后缀L可确保在标签之间使用给定的RE进行递归搜索。

PS>披露:我是jtc-用于JSON操作的shell cli工具的创建者