2010-12-18 36 views
0

問候。重複簡單的正則表達式讓我難住

這麼簡單的問題讓我難堪。這裏的人很有幫助。

我想匹配一個包含一些固定文本和隨機數字的字符串。

echo blah blah abc123 | grep -o abc 
abc 

echo blah blah abc123 | grep -o abc[0-9] 
abc1 

echo blah blah abc123 | grep -o abc[0-9]+ 

echo blah blah abc123 | grep -o "abc[0-9]+" 

echo blah blah abc123 | grep -o "abc[0-9]*" 
abc123 

echo blah blah abc123 | grep -o abc[0-9]{3} 

echo blah blah abc123 | grep -o "abc[0-9]{3}" 

*運算符(匹配零次或多次)是唯一符合我預期的工作。

爲什麼+運算符(匹配1次或多次)不匹配?

爲什麼特定的重複計數算子{3}不匹配?

我的Ubuntu 10.10,如果它的確與衆不同運行在bash shell這些例子。

非常感謝。

回答

6

他們都在你逃跑的特殊字符的工作:

$ echo blah blah abc123 | grep -o "abc[0-9]\+" 
abc123 
$ echo blah blah abc123 | grep -o "abc[0-9]\{3\}" 
abc123 

偵測到的,正則表達式是尋找一個文字+{,你可能已經推出。至於爲什麼你必須保留*沒有轉義,但你必須逃脫+,我不確定。

+3

現在我明白grep的手冊頁」的含義......在基本的正則表達式的元字符,+,{,|,(和)失去了它們的特殊含義;改用反斜槓的版本\? \ +,\ {,\ |,\\(和\\)「 – OddZon 2010-12-18 03:22:49

+1

順便說一句,我真的很喜歡stackoverflow。 – OddZon 2010-12-18 03:26:20

+2

問題是,默認情況下,'grep'使用這個(有限)版本的regexen。使用'egrep'或'grep -E'來獲得你想要的正則表達式語法。 – 2010-12-18 04:24:34