是否可以在bash正则表达式中执行OR?

时间:2019-06-04 18:57:27

标签: regex bash grep

我知道我可以使用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

1 个答案:

答案 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,它很好地说明了这种引用行为。