使用 /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' 选项将仅在执行替换时打印
我想自动标记我的工件,我写了一个简单的 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' 选项将仅在执行替换时打印