正则表达式与通配符匹配

时间:2018-02-27 23:45:54

标签: regex bash glob

我正在尝试检查给定字符串中是否包含.rel6.。我对Bash正则表达式行为感到有些困惑。我在这里缺少什么?

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

1 个答案:

答案 0 :(得分:3)

=~运算符对其左侧的字符串执行正则表达式匹配操作,右侧有表达式模式。因此,所有RHS都是正则表达式模式。

[[ $os =~ *el6* ]] && echo yes不匹配,因为正则表达式为*el6*,而*是量词,但您无法量化正则表达式的开头,因此它是无效的正则表达式。请注意,[[ $os =~ el6* ]] && echo yes将打印yes,因为el6*匹配el和0 + 6 s。

[[ $os =~ *".el6." ]] && echo yes类似的问题是:正则表达式为*.el6.,且无效。

如果您想检查字符串中是否有.el6.,请使用[[ $os = *".el6."* ]] && echo yes。在这里,glob模式将为*.el6.*,您需要=运算符。