Linux下使用Grep提取JSON中oid值失败问题排查
从JSON响应提取oid值并存入变量的问题解决
问题
要在Linux系统中,从存储于$Response变量的JSON内容里提取oid字段值并存入$oid变量。当前使用的命令如下:
oid= $Response | grep -Po '"oid": *\K"[^"]\*"'
执行后echo $oid显示为空,未能提取到目标值xyzxyzxyzxyzxyzxyzxyz。目标JSON简化版为:
{ "count": 1, "items": [{ "oid": "xyzxyzxyzxyzxyzxyzxyz", "creationDate": "2019-02-05T02:21:08.662+0000" }] }
问题原因
- 变量赋值语法错误:
oid= $Response中等号后不能有空格,且直接将$Response作为命令执行无法传递内容给grep,需用命令替换$(...)捕获输出,同时通过echo输出变量内容。 - 正则表达式错误:
[^"]\*的*位置错误,应改为[^"]*;若$Response存储的是原生JSON(双引号而非"转义字符),正则里需用"替代"。 - 未处理引号:即使匹配成功,结果会包含双引号,需去除才能得到纯
oid值。
修正后的命令
场景1:$Response存储原生JSON(双引号格式)
oid=$(echo "$Response" | grep -Po '"oid": *\K"[^"]*"' | tr -d '"')
echo "$Response":输出变量中的JSON内容grep -Po '"oid": *\K"[^"]*"':用Perl兼容正则,\K忽略前面匹配的"oid":部分,仅捕获"包裹的oid值tr -d '"':移除结果中的双引号,得到纯字段值
场景2:$Response存储带"转义的内容
oid=$(echo "$Response" | grep -Po '"oid": *\K"[^"]*"' | tr -d '"')
验证
执行修正后的命令后,运行echo $oid,即可输出目标值xyzxyzxyzxyzxyzxyzxyz。
内容的提问来源于stack exchange,提问作者Chris.Ae
相关产品推荐
相关产品推荐

