如何用正则+sed/grep提取JSON指定键值?兼容XML/JSON场景
使用正则提取JSON键值的Shell命令方案
场景1:提取单个嵌套JSON的键值(abc.json)
abc.json内容:
{
"name": "marsh",
"address":[{"house_no":123,"Landmark":"Opp. to starbucks","mobile_no":{}}]
}
提取house_no的数值:
house_no=$(grep -oP '"house_no"\s*:\s*\K\d+' abc.json) echo $house_no # 输出123
参数说明:
-o:仅输出匹配到的内容-P:启用Perl兼容正则表达式\K:忽略前面匹配的"house_no":及前后空格,只保留后续的数字部分
提取Landmark的字符串值:
landmark=$(grep -oP '"Landmark"\s*:\s*"\K[^"]+' abc.json) echo $landmark # 输出Opp. to starbucks
这里用[^"]+匹配引号内的所有非引号字符,确保只提取到目标字符串内容。
场景2:提取数组中多个对象的键值(多对象JSON示例)
目标JSON内容:
{ "id": 5229, "Type": B, "exclusions": [ { "id": 3486, "desig": "A", "price": 101, }, { "id": 3489, "desig": "A", "price": 101, }]}, { "id": 5239, "Type": B, "exclusions": [] }
提取所有desig的值:
# 提取所有值并输出 grep -oP '"desig"\s*:\s*"\K[^"]+' multi.json # 存入数组以便后续处理 desig_array=($(grep -oP '"desig"\s*:\s*"\K[^"]+' multi.json)) # 遍历数组 for val in "${desig_array[@]}"; do echo $val done
注意事项
- 正则提取JSON仅适用于格式规范、键值不跨多行、无转义字符的场景,复杂JSON仍建议优先使用jq工具
- 若处理XML格式,可调整正则适配标签结构,例如提取
<house_no>123</house_no>的命令:house_no=$(grep -oP '<house_no>\K[^<]+' file.xml)
内容的提问来源于stack exchange,提问作者user20347690
相关产品推荐
相关产品推荐

