如何在Linux中用正则表达式提取JSON文件中的值?
解决bash正则提取JSON键值的问题
先指出你现有代码的几个问题:
- 变量赋值错误:
var=cat file.json无法正确读取文件内容,必须用命令替换语法 - 正则未适配JSON格式里的空格(
"abc":后存在空格),匹配逻辑有误 - 输出的是匹配的第1组(
abc":),但你需要的是第2组的数值内容
修正后的代码
# 正确读取文件内容到变量 var=$(cat file.json) # 适配空格、精准捕获双引号内的值 regex='"abc":\s*"([^"]+)"' # 执行正则匹配 [[ $var =~ $regex ]] # 输出目标捕获内容 echo "${BASH_REMATCH[1]}"
关键说明
- 变量赋值:
$(cat file.json)会把文件内容完整读取到var中,也可以用更高效的var=$(<file.json) - 正则逻辑:
"abc":精准匹配目标键名\s*匹配0个或多个空格,兼容JSON的格式规范"([^"]+)"捕获双引号内的内容,[^"]+表示匹配除双引号外的所有字符,避免贪婪匹配导致的错误
- 捕获组:
BASH_REMATCH[1]对应正则中第一个括号内的捕获结果,也就是abc对应的值123
提取所有键值的通用方法
如果要批量提取所有键对应的值,可以用循环结合正则实现:
var=$(cat file.json) # 同时匹配字符串值(带双引号)和数字值(不带双引号) regex='"([^"]+)":\s*(?:"([^"]+)"|([0-9]+))' # 循环遍历所有匹配结果 while [[ $var =~ $regex ]]; do echo "键: ${BASH_REMATCH[1]}, 值: ${BASH_REMATCH[2]:-${BASH_REMATCH[3]}}" # 截断已匹配的部分,继续处理剩余内容 var=${var#*"${BASH_REMATCH[0]}"} done
内容的提问来源于stack exchange,提问作者mmk
相关产品推荐
相关产品推荐

