我正在尝试检查给定字符串中是否有.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+6
s。[[ $os =~ *".el6." ]] && echo yes
也有类似的问题:regex是*.el6.
,它是无效的。
如果要检查字符串中是否有.el6.
,请使用[[ $os = *".el6."* ]] && echo yes
。这里,glob模式将是*.el6.*
,您需要=
运算符。
关于regex - 正则表达式与通配符匹配,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49019795/