使用 /bin/ash 从表达式匹配模式中提取子序列

Extracting subsequence from expression matching pattern with /bin/ash

我想自动标记我的工件,我写了一个简单的 shell 脚本,它从 git 标签(匹配模式)中提取版本:

#!/bin/sh
regex="^RELEASE-(.*)$"
if [[  =~ $regex ]]; then
 echo -n "${BASH_REMATCH[1]}"
 exit 0
else
 exit 1 
fi

然后我在使用 docker:latest 图像构建时遇到错误,经过一番努力我发现,无论出于何种原因,该图像没有 /bin/bash,他们更喜欢/bin/ash 代替。

问题是,我没有在 ash 中找到任何正则表达式运算符的替代品。谷歌搜索后,我发现建议使用 sed 来做到这一点,就像:

echo -n "RELEASE-1.0.0" | sed 's/^RELEASE-\(.*\)$//'

但是,该示例失败了,因为如果正则表达式不匹配,它会打印整个输入...

正则表达式匹配运算符是否有任何合理的replacement/fix?

试试 运行 只在匹配项上打印的修改版本:

echo -n "RELEASE-1.0.0" | sed -n 's/^RELEASE-\(.*\)$//p'

's' 命令的 '-n' sed 选项和 '/p' 选项将仅在执行替换时打印