我正在尝试检查给定字符串中是否有.rel6.。我对Bash regex的行为有点困惑。我错过了什么?

os=$(uname -r)                        # set to string "2.6.32-504.23.4.el6.x86_64"

[[ $os =~ *el6*    ]] && echo yes     # doesn't match, I understand it is Bash is treating it as a glob expression
[[ $os =~ el6      ]] && echo yes     # matches
[[ $os =~ .el6     ]] && echo yes     # matches
[[ $os =~ .el6.    ]] && echo yes     # matches
[[ $os =~ ".el6."  ]] && echo yes     # matches
[[ $os =~ *".el6." ]] && echo yes     # * does not match - why? *
[[ $os =~ ".el6."* ]] && echo yes     # matches

re='\.el6\.'
[[ $os =~ $re      ]] && echo yes     # matches

尤其是这个:
[[ $os =~ *".el6." ]] && echo yes

最佳答案

=~运算符对其左侧的字符串执行正则表达式匹配操作,右侧为表达式模式。所以,这里所有的RHS都是regex模式。
[[ $os =~ *el6* ]] && echo yes不匹配,因为regex是*el6**是一个量词,但是您不能量化regex的开头,因此它是一个无效的regex。注意,[[ $os =~ el6* ]] && echo yes将打印yes作为el6*匹配el和0+6s。
[[ $os =~ *".el6." ]] && echo yes也有类似的问题:regex是*.el6.,它是无效的。
如果要检查字符串中是否有.el6.,请使用[[ $os = *".el6."* ]] && echo yes。这里,glob模式将是*.el6.*,您需要=运算符。

关于regex - 正则表达式与通配符匹配,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49019795/

10-10 21:00