首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >匹配具有精确整数范围的子字符串的Bash正则表达式

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

Stack Overflow用户
提问于 2015-05-21 13:00:18
回答 2查看 848关注 0票数 2

我需要匹配包含

代码语言:javascript
复制
foo{77..93}

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

代码语言:javascript
复制
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],但这不起作用。

谢谢

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-05-21 13:04:26

如果要使用regex,则必须使其稍微复杂一些:

代码语言:javascript
复制
if [[ $str =~ foo(7[7-9]|8[0-9]|9[0-3]) ]]; then
    id=${BASH_REMATCH[0]}
fi

注意,我已经删除了整个模式的捕获组,现在正在使用匹配数组的第0元素。

另外,为了与bash的旧版本最大程度地兼容,我建议将模式赋值给一个变量,并在测试中使用如下所示:

代码语言:javascript
复制
re='foo(7[7-9]|8[0-9]|9[0-3])'
if [[ $str =~ $re ]]; then
    id=${BASH_REMATCH[0]}
fi

使用regex的另一种方法是使用算术上下文,如下所示:

代码语言:javascript
复制
if (( "${str#foo}" >= 77 && "${str#foo}" <= 93 )); then
    id=$str
fi

这将从变量的开头剥离"foo“部分,以便对整数部分进行数值比较。

票数 6
EN

Stack Overflow用户

发布于 2015-05-21 13:15:18

当然,使用Perl很容易做到:

代码语言:javascript
复制
$ 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甚至:

代码语言:javascript
复制
$ 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
foo93
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30374557

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档