2016-11-13 70 views
0

由于某种原因,下面的正则表达式匹配似乎不起作用。在Bash正则表达式中匹配单个字符

string="#Hello world"; 
[[ "$string" =~ 'ello' ]] && echo "matches"; 
[[ "$string" =~ 'el.o' ]] && echo "matches"; 

第一个命令成功(按预期),但第二个命令不成功。

这段时间不应该被正则表达式视为单个字符吗?

回答

3

引用句点时,会将其视为文字字符,而不是正则表达式元字符。如果要引用整个正则表达式,最佳做法是在变量中执行此操作,其中正则表达式匹配规则不生效,然后展开未加引号的参数(在[[ ... ]]内部可以安全地执行此操作)。

regex='el.o' 
[[ "$string" =~ $regex ]] && echo "matches" 
+0

所以,我猜手段'[['不只是一个命令的别名,并有一些神奇的魔力去幕后, 对? –

+0

正确; '['是'test'的别名,但'[['是引入'bash'的复合命令之一(非字母)关键字。它有自己的规则来评估其中包含的表达式。 – chepner

+0

是否有'[['关键字?为了了解更多信息,我很难知道Google需要什么。 –

0
string="#Hello world"; 
[[ "$string" =~ ello ]] && echo "matches"; 
[[ "$string" =~ el.o ]] && echo "matches"; 

测试

$ string="hh elxo fj" 
$ [[ "$string" =~ el.o ]] && echo "matches"; 
matches