2012-10-31 63 views
12

的代碼是這樣的:爲什麼BASH_REMATCH不能用於引用正則表達式?

#!/bin/bash 
if [[ foobarbletch =~ 'foo(bar)bl(.*)' ]] 
then 
    echo "The regex matches!" 
    echo $BASH_REMATCH 
    echo ${BASH_REMATCH[1]} 
    echo ${BASH_REMATCH[2]} 
fi 

當我嘗試運行它,它不顯示任何內容:

bash-3.2$ bash --version 
GNU bash, version 3.2.48(1)-release (x86_64-apple-darwin12) 
Copyright (C) 2007 Free Software Foundation, Inc. 
bash-3.2$ /bin/bash test_rematch.bash 
bash-3.2$ 

有沒有人有這個想法?謝謝!

回答

35

在你的bash REGEX中,你應該刪除引號。這就是爲什麼這不起作用。

如果你有空間,我建議使用這種方法:

#!/bin/bash 
x='foo bar bletch' 
if [[ $x =~ foo[[:space:]](bar)[[:space:]]bl(.*) ]] 
then 
    echo The regex matches! 
    echo $BASH_REMATCH  
    echo ${BASH_REMATCH[1]} 
    echo ${BASH_REMATCH[2]} 
fi 
+0

謝謝!但是如果空格顯示在REGEX中而不使用引號,我該怎麼辦? –

+0

查看我的編輯帖子 –

+0

@Firegun另外,你也可以用''''或''''或''「''來表示空間(選擇你的毒藥)(第一個表現不好,後面是反斜槓)由空間) – doubleDown

7

感謝您的調試聲明,echo The regex matches!,你應該已經注意到,與BASH_REMATCH沒有問題,因爲如果語句評估爲false

在bash中,與=~一起使用的正則表達式未加引號。如果右側的字符串被引用,則將其視爲字符串文字。

如果你想在你的正則表達式中包含空格,那麼使用適當的字符類,或者如果你想要空格,可以逃脫你的空間。

9

您還可以將引用正則表達式賦值給一個變量:

#!/bin/bash 

x='foobarbletch' 

foobar_re='foo(bar)bl(.*)' 

if [[ $x =~ $foobar_re ]] ; then 
    echo The regex matches! 
    echo ${BASH_REMATCH[*]} 
    echo ${BASH_REMATCH[1]} 
    echo ${BASH_REMATCH[2]} 
fi 

這不僅支持簡單的報價,但給人的正則表達式的名稱,它可以幫助可讀性。

+0

我*愛*可讀性。 – Cometsong

相關問題