如何使用grep或其他命令正确提取匹配内容:提取不含特殊字符与后缀的版本号
别担心,我来帮你搞定这个文本提取的问题!你的需求是从转义后的JSON片段里提取纯版本号并去掉-internal后缀,其实可以用几种简洁的方法实现,我给你一步步拆解:
方案1:grep + sed 组合(无需额外工具)
这个方法先精准提取出版本相关内容,再清理后缀:
grep -oP '(?<="versionName": ")[^"]+' file.json | sed 's/-internal$//'
grep -oP部分:用正向预查匹配到versionName后的版本字符串(直到下一个转义引号"),只输出匹配的核心内容sed 's/-internal$//':精准去掉末尾的-internal后缀,直接得到纯版本号
方案2:awk 一步到位
awk可以直接按分隔符拆分内容,省去多步管道操作:
awk -F'"' '/versionName/ {split($4, ver, "-"); print ver[1]}' file.json
-F'"':把转义引号作为字段分隔符,将每行内容拆分成多个字段/versionName/:只处理包含目标关键词的行,避免无效匹配split($4, ver, "-"):把第4个字段(也就是1.1.5000-internal)按-拆分,存到数组ver里print ver[1]:输出数组的第一个元素,就是你要的1.1.5000
方案3:用jq 处理JSON(最靠谱的方法)
如果你的系统安装了jq(专门处理JSON的工具),这个方法最稳妥,能避免正则匹配的各种边缘问题:
sed 's/"/"/g' file.json | jq -r '.versionName | split("-")[0]'
sed 's/"/"/g':先把转义的"替换成正常的双引号,让内容变成标准JSON格式jq -r '.versionName | split("-")[0]':提取versionName字段,按-拆分后取第一个元素,-r确保输出不带引号
为什么你之前的尝试没成功?
你第一个grep命令失败,可能是因为部分环境里的grep -P对正向预查的语法支持有差异;而后面的命令只是简单截取内容,没有针对性处理-internal后缀,所以结果不符合预期。
试试上面的方法,应该能完美得到你想要的1.1.5000!
内容的提问来源于stack exchange,提问作者nuhkoca
相关产品推荐
相关产品推荐

