CI/CD脚本中grep -E无结果而grep -Po正常的原因咨询
为什么grep -E无法替代grep -Po得到匹配结果?
核心原因是grep -P和grep -E在正则语法支持和输出逻辑上存在关键差异:
正则语法不兼容
grep -P启用的是Perl兼容正则表达式(PCRE),支持你用到的零宽断言语法:(?<=<version>)(正向反向预查)和(?=</version>)(正向预查),这些语法能精准提取<version>标签之间的内容,同时不包含标签本身。
而grep -E启用的是扩展正则表达式(ERE),传统ERE标准不支持零宽断言,你的匹配模式里的(?<=...)和(?=...)会被当作普通字符串处理,自然匹配不到目标内容。输出行为的差异
原命令里的-o参数是让grep只输出匹配到的部分,而-E本身不包含这个行为——就算你给grep -E加上-o,因为正则语法不兼容,依然无法识别零宽断言,还是会匹配失败。
替代方案(用ERE实现相同效果)
如果一定要用扩展正则,可以结合sed来提取分组内容,示例:
latestVersionAvailable=$(curl -s $artifactoryPath/maven-metadata.xml | grep -E "<version>$VERSION.*?</version>" | sed -E "s/.*<version>($VERSION.*?)<\/version>.*/\1/" | sort -V | tail -1)
或者用awk直接处理:
latestVersionAvailable=$(curl -s $artifactoryPath/maven-metadata.xml | awk -v ver="$VERSION" '/<version>.*<\/version>/{match($0, "<version>("ver".*?)<\/version>", arr); if(arr[1]) print arr[1]}' | sort -V | tail -1)
内容的提问来源于stack exchange,提问作者Sri
相关产品推荐
相关产品推荐

