如何用jq基于正则匹配键名提取对应id值?
提取匹配指定键名的JSON对象中的id值
给定如下结构的JSON对象:
{ "key-foo-1.0": [ { "key1": "foo", "key2": "bar", "id": "01" }, { "key1": "foo", "key2": "bar", "id": "23" } ], "key-bar-1.0": [ { "key1": "foo", "key2": "bar", "id": "45" }, { "key1": "foo", "key2": "bar", "id": "67" } ], "key-baz-1.0": [ { "key1": "foo", "key2": "bar", "id": "89" } ] }
需要提取所有父键名匹配.*foo.*或.*bar.*的id值,期望输出:
01 23 45 67
之前尝试的命令仅能筛选出符合键名的对象,但未完成id提取:
$ cat json | jq 'with_entries(if (.key|test(".*foo.*$")) then ( {key: .key, value: .value } ) else empty end )'
简洁解决方案
直接使用以下jq命令即可实现需求:
cat json | jq -r 'to_entries[] | select(.key | test("foo|bar")) | .value[].id'
命令解释
to_entries[]:将顶层对象转换为键值对数组并展开每一项select(.key | test("foo|bar")):筛选出键名包含foo或bar的键值对(test("foo|bar")等价于匹配.*foo.*或.*bar.*).value[].id:展开匹配键对应的数组,提取每个对象的id字段-r:输出原始字符串(去掉JSON格式的引号)
如果需要更严格的匹配(比如限定键名格式为key-xxx-1.0),可以调整正则表达式:
cat json | jq -r 'to_entries[] | select(.key | test("key-(foo|bar)-1\\.0")) | .value[].id'
内容的提问来源于stack exchange,提问作者iAmoric
相关产品推荐
相关产品推荐

