在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
相关产品推荐
相关产品推荐

