我需要匹配包含
foo{77..93}并在变量中捕获上述子字符串。到目前为止我有:
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但这也会捕获目标范围以外的ids (例如foo95)。有办法将正则表达式限制在精确的整数范围内吗?(试过foo[77-93],但这不起作用。
谢谢
发布于 2015-05-21 13:04:26
如果要使用regex,则必须使其稍微复杂一些:
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使用regex的另一种方法是使用算术上下文,如下所示:
if (( "${str#foo}" >= 77 && "${str#foo}" <= 93 )); then
id=$str
fi这将从变量的开头剥离"foo“部分,以便对整数部分进行数值比较。
发布于 2015-05-21 13:15:18
当然,使用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或者awk甚至:
$ echo foo{1..100} | tr ' ' '\n' | awk -F 'foo' '$2>=77 && $2<=93
{print}'
foo77
foo78
foo79
foo80
foo81
foo82
foo83
foo84
foo85
foo86
foo87
foo88
foo89
foo90
foo91
foo92
foo93https://stackoverflow.com/questions/30374557
复制相似问题