我知道我可以使用grep,awk等,但是我有大量的bash脚本,其中包含一些使用=~
的条件语句,如下所示:
#works
if [[ "bar" =~ "bar" ]]; then echo "match"; fi
如果我尝试使其进行逻辑或,则无法使其匹配:
#doesn't work
if [[ "bar" =~ "foo|bar" ]]; then echo "match"; fi
或者也许是这个...
#doesn't work
if [[ "bar" =~ "foo\|bar" ]]; then echo "match"; fi
是否可以使用=~
进行逻辑或,还是应该切换到grep
?
答案 0 :(得分:5)
您不需要正则表达式运算符即可进行替代匹配。 [[
扩展测试运算符允许使用extended pattern matching选项,您可以在下面使用这些选项。 +(pattern-list)
提供了一种方法来匹配由|
[[ bar == +(foo|bar) ]] && echo match
将[[
关键字与==
运算符一起使用时,扩展的glob规则将自动应用。
对于正则表达式部分,使用任何支持ERE库的命令,都可以使用|
构造体完成替换
[[ bar =~ foo|bar ]] && echo ok
[[ bar =~ ^(foo|bar)$ ]] && echo ok
到目前为止,为什么引号中的正则表达式不起作用的原因是,bash
中的正则表达式解析在3.1和3.2版本之间已更改。在3.2之前,可以安全地将正则表达式模式用引号引起来,但这在3.2中已更改。从那时起,正则表达式应始终未引用。
您应该通过使用反斜杠转义来保护任何特殊字符。始终兼容的最佳方法是将您的正则表达式放入变量中,并在[[
中将该变量展开而不加引号。另请参见Chet Ramey's Bash FAQ, section E14,它很好地说明了这种引用行为。