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

sim*_*mon 1 regex bash grep

我知道我可以使用grep,awk等,但是我有大量的bash脚本,其中包含一些条件语句,=~如下所示:

#works
if [[ "bar" =~ "bar" ]]; then echo "match"; fi
Run Code Online (Sandbox Code Playgroud)

如果尝试使其进行逻辑或,则无法使其匹配:

#doesn't work
if [[ "bar" =~ "foo|bar" ]]; then echo "match"; fi
Run Code Online (Sandbox Code Playgroud)

也许这...

#doesn't work
if [[ "bar" =~ "foo\|bar" ]]; then echo "match"; fi
Run Code Online (Sandbox Code Playgroud)

是否可以通过使用逻辑OR =~或我应该切换到grep

Ini*_*ian 5

您不需要正则表达式运算符即可进行替代匹配。该[[扩展的测试运营商允许扩展模式匹配使用的选项,你可以做以下。的+(pattern-list)提供了一种方法来匹配一个更数量的图案分离由|

[[ bar == +(foo|bar) ]] && echo match
Run Code Online (Sandbox Code Playgroud)

[[关键字与==运算符一起使用时,扩展的glob规则将自动应用。

至于正则表达式部分,使用任何支持ERE库的命令,都可以使用以下|结构进行替换:

[[ bar =~ foo|bar ]] && echo ok
[[ bar =~ ^(foo|bar)$ ]] && echo ok
Run Code Online (Sandbox Code Playgroud)

到目前为止,用引号引起的正则表达式为什么不起作用的原因是,在bash3.1和3.2版本之间,正则表达式解析已更改。在3.2之前,可以安全地将正则表达式模式用引号引起来,但这在3.2中已更改。从那时起,正则表达式应始终未引用。

您应该通过使用反斜杠将其转义来保护任何特殊字符。始终兼容的最佳方法是将正则表达式放入变量中,并在[[不加引号的情况下扩展该变量。另请参阅Chet Ramey的Bash FAQ,第E14节,很好地解释了这种引用行为。