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

在Linux中用正则表达式提取JSON指定键值的Shell脚本实现

用正则表达式替代JQ提取JSON指定键值

先说明:正则处理JSON的局限性

JSON结构允许键值对间任意空格、换行,字符串还可能包含转义字符(比如\"),正则很难覆盖所有合法的JSON场景,因此优先推荐用JQ。但如果必须用正则,下面是适配大多数常见场景的实现方案。

脚本实现

假设你的abc.json中目标键值的常见格式如下(允许键名前后带空格、值为字符串或数字):

{
  "value4": {
    "value41": {
      "value411": "要提取的内容"
    }
  }
}

方法1:grep + sed 组合

在XYZ.sh中替换原来的JQ命令为:

data1=$(grep -o '"value411":\s*"[^"]*"' abc.json | sed 's/"value411":\s*"//;s/"$//')
  • 拆解说明:
    • grep -o仅输出匹配到的片段,精准定位"value411":后接任意空格、再被双引号包裹的内容
    • sed分两步处理:先移除开头的"value411": ",再移除结尾的双引号,最终得到纯值

方法2:awk 单工具实现

如果不想用多工具组合,也可以用awk完成:

data1=$(awk '/"value411":/ {gsub(/.*"value411":\s*"|"$/,""); print}' abc.json)
  • 拆解说明:
    • 定位包含"value411":的行
    • 用gsub替换掉行内无用部分:从行首到"value411": "的内容,以及结尾的双引号,最后打印剩余内容

适配跨多行或数字值的场景

如果JSON的键值对可能跨多行,或者目标值是不带双引号的数字,可使用以下调整后的命令:

data1=$(grep -zo '"value411":\s*([^",}]*)' abc.json | sed 's/"value411":\s*//;s/["},]*$//')
  • 新增特性:
    • grep -z用空字符作为行分隔符,能处理跨多行的键值对
    • 正则匹配值为非引号、非逗号、非右大括号的内容,兼容字符串和数字类型

内容的提问来源于stack exchange,提问作者user18148705

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 06:31:06