2010-09-06 79 views
2

我試圖在幾個.txt文件的文本中找到某個特定的序列。我正在尋找一個連接到4位數字的字符串。例如Watson1990。我使用在線測試器測試了正則表達式,它似乎可以工作,但表達式(或它的組合)未能在我的文件上生成輸出。使用grep查找字符串模式

我的正則表達式如下:

egrep '\w*\d{4}' *.txt 

但是它不會產生任何輸出。你能告訴我這有什麼問題嗎?我正在使用OSX(雪豹)。

謝謝。

回答

4

正則表達式不起作用的原因是,在擴展正則表達式語法中,令牌\d與字母d(不是數字)匹配。改爲使用字符類[0-9]

另外\w匹配數字以及字母,所以你可能不希望在這裏使用它。使用字符類[A-Za-z]來匹配A-Z或a-z中的字母。

我將*更改爲+,因爲大概您希望在數字前至少有一個字母。 +的意思是「一個或多個」,而*的意思是「零個或多個」。

最後,您可能希望考慮如果您看到5位數字會出現什麼情況。您的正則表達式當前接受它,因爲5位數字以4位數字開頭。

總之,試試這個:

egrep '[a-zA-Z]+[0-9]{4}' *.txt 
+0

Bryers +1如果你到OP解釋爲什麼他的命令是錯誤的...我知道他真的只是在尋找一個可行的命令,但解釋爲什麼他不將作出更好的回答。 – Stephen 2010-09-06 13:34:53

+1

@Stephen:好的......如果你正確拼寫我的名字,我會贊成你的評論。 ;) – 2010-09-06 14:05:18

+0

謝謝 - 看起來像一個更嚴格的方法,我對它的工作方式也有了更好的理解。 – djq 2010-09-06 14:28:21

1

你的正則表達式使用Perl,而不是擴展,正則表達式的組件。嘗試

grep -P '\w\d{4}' *.txt 

如果您的grep版本具有該選項。我使用的是GNU grep 2.5.1,-P選項被列爲「高度實驗性」。

1

GNU的grep

grep -Po "(\w+\d{4})" file 
+0

謝謝 - 完美的工作。 – djq 2010-09-06 13:27:22

+1

@ ghostdog74 +1如果你向OP解釋爲什麼他的命令是錯誤的......我知道他真的只是在尋找一個可行的命令,但是解釋了爲什麼他不會做出更好的回答。 – Stephen 2010-09-06 13:33:44

+0

我一直在尋找有用的東西,但也想了解爲什麼它也是錯誤的。這是我的第一個grep /正則表達式。順便提一句,我還使用'-h'標誌從結果中刪除文件名。 – djq 2010-09-06 13:39:22