带有 \d 的 RegEx 在带有 [[ 的 if-else 语句中不起作用

带有 \d 的 RegEx 在带有 [[ 的 if-else 语句中不起作用

我写了以下脚本。稍后将在构建过程中使用它。我的目标是确定它是预发布版还是发布版。为了归档此脚本,我将 $release 与 RegEx 进行比较。如果我的 RegEx 匹配,则它是预发布版,如果不匹配,则它是发布版。

#/bin/bash
release="1.9.2-alpha1"
echo "$release"
if [[ "$release" =~ \d+\.\d+\.\d+[-]+.* ]];then
echo "Pre"
else
echo "Release"
fi

但结果我总是得到以下结果:

~$ bash releasescript.sh
1.9.2-alpha1
Release

版本:

Ubuntu 18.04.1 LTS

我用过这个编辑测试我的 RegEx。我被困了至少 6 个小时,因此非常希望得到帮助。

答案1

\d并且\w不工作POSIX 正则表达式,你可以[[:digit:]]使用

#/bin/bash
release="1.9.2-alpha1"
echo "$release"
LANG=C # This needed only if script will be used in locales where digits not 0-9
if [[ "$release" =~ ^[[:digit:]]+\.[[:digit:]]+\.[[:digit:]]+-+ ]];then
echo "Pre"
else
echo "Release"
fi

我已经测试过这个脚本,它为给定的 $release 输出“Pre”

检查了您的正则表达式构建器,它只适用于 perl 兼容和 javascript 正则表达式,而您需要 posix 或 posix 扩展。

经过@甜点

[0-9]是 的较短替代方法[[:digit:]]。由于要匹配字符串的开头,因此应添加^,而.*在结尾处则是多余的:^[0-9]+\.[0-9]+\.[0-9]+-+– 使用组可以进一步缩短为:^([0-9]+\.){2}[0-9]+-+

相关内容