我有以下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()需要字符串输入
答案 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工具的创建者