Bash正则提取最后一个release-与--间内容的实现问题
在Bash中提取最后一次出现的“release-”与“--”之间的内容
问题分析
你的脚本存在两个核心问题:
- BASH_REMATCH数组引用错误:直接写
$BASH_REMATCH[1]会被解析为「数组第一个元素」拼接字符串[1],正确的引用格式应为${BASH_REMATCH[1]}。 - 正则分组冗余:最外层括号完全多余,它会把整个匹配内容放入
BASH_REMATCH[0],而你需要的是内层括号捕获的目标片段。
解决方案1:修正正则与数组引用
利用Bash的贪婪正则匹配特性(自动匹配最后一次出现的release-),调整脚本如下:
artifactoryVersion="inte_integration-abc-abcde-abcdefg-release-release-PI_4.1-Sprint-3.1a--1.0.2-RELEASE" if [[ "$artifactoryVersion" =~ .*release-(.*)--.* ]]; then echo "${BASH_REMATCH[1]}" fi
执行后输出:
PI_4.1-Sprint-3.1a
解决方案2:Bash内置字符串操作(无外部命令)
无需正则,直接用Bash的字符串截取功能实现,效率更高:
artifactoryVersion="inte_integration-abc-abcde-abcdefg-release-release-PI_4.1-Sprint-3.1a--1.0.2-RELEASE" # 截取--之前的所有内容 temp=${artifactoryVersion%%--*} # 截取最后一个release-之后的内容 result=${temp##*release-} echo "$result"
解决方案3:sed命令(适合批量处理)
如果需要处理多行文本或管道输入,可使用sed:
echo "$artifactoryVersion" | sed -E 's/.*release-(.*)--.*/\1/'
内容的提问来源于stack exchange,提问作者Konstantinos Loizas
相关产品推荐
相关产品推荐

