You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 13:35:17