2016-11-13 69 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