Regex Bash正则表达式匹配具有精确整数范围的子字符串

Regex Bash正则表达式匹配具有精确整数范围的子字符串,regex,bash,Regex,Bash,我需要匹配一个字符串$str,该字符串包含 并在变量中捕获上述子字符串。 到目前为止,我已经: str=/random/string/containing/abc-foo78_efg/ # for example if [[ $str =~ (foo[7-9][0-9]) ]]; then id=${BASH_REMATCH[1]} fi echo $id # gives foo78 但这也会捕获目标范围之外的ID(例如foo95)。 有没有办法将正则表达式限制在一个精确的整数范围内?

我需要匹配一个字符串
$str
,该字符串包含

并在变量中捕获上述子字符串。 到目前为止,我已经:

str=/random/string/containing/abc-foo78_efg/ # for example
if [[ $str =~ (foo[7-9][0-9]) ]]; then
    id=${BASH_REMATCH[1]}
fi
echo $id # gives foo78
但这也会捕获目标范围之外的ID(例如
foo95
)。 有没有办法将正则表达式限制在一个精确的整数范围内?(尝试了
foo[77-93]
,但不起作用


谢谢

如果你想使用正则表达式,你必须让它稍微复杂一点:

if [[ $str =~ foo(7[7-9]|8[0-9]|9[0-3]) ]]; then
    id=${BASH_REMATCH[0]}
fi
请注意,我已经删除了整个模式的捕获组,现在正在使用匹配数组的第0个元素

另外,为了最大限度地兼容旧版本的bash,我建议将模式分配给一个变量,并在测试中使用如下方式:

re='foo(7[7-9]|8[0-9]|9[0-3])'
if [[ $str =~ $re ]]; then
    id=${BASH_REMATCH[0]}
fi
if (( "${str#foo}" >= 77 && "${str#foo}" <= 93 )); then
    id=$str
fi
使用正则表达式的替代方法是使用算术上下文,如下所示:

re='foo(7[7-9]|8[0-9]|9[0-3])'
if [[ $str =~ $re ]]; then
    id=${BASH_REMATCH[0]}
fi
if (( "${str#foo}" >= 77 && "${str#foo}" <= 93 )); then
    id=$str
fi

if(“${str#foo}”>=77&“${str#foo}”使用Perl肯定很容易:

$ echo foo{1..100} | tr ' ' '\n' | perl -lne 'print $_ if m/foo(\d+)/ and $1>=77 and $1<=93'
foo77
foo78
foo79
foo80
foo81
foo82
foo83
foo84
foo85
foo86
foo87
foo88
foo89
foo90
foo91
foo92
foo93

太好了,汤姆,谢谢。不过
$str
是一个包含
foox
的字符串。这会如何改变你的答案?它不会影响基于正则表达式的方法。要使用另一种方法,你必须使用类似
num=${str#*foo};num=${num/[^0-9]/}的东西来提取子字符串
。在这种情况下,我个人只会选择第一种方法。