2012-01-07 157 views
1

我對grep有一個非常基本的困惑。假設我有一個下列文件到grep中:Linux grep命令混亂

test.txt: 
This is an article 
from some newspaper 
Article is good 
newspaper is not. 

現在,如果我用下面的表達式

grep -P "is\s*g" test.txt 

用grep我得到的線:

Article is good 

但是,如果我這樣做:

grep -P "is*g" test.txt 

我沒有得到任何事情。我的問題是,因爲asterix(*)是一個通配符,表示前一個字符的0個或更多個重複,所以grep的輸出不應該是相同的。爲什麼零次或多次重複的's'沒有給出任何輸出?

我在這裏錯過了什麼。謝謝您的幫助!

回答

8

因爲您的輸入中沒有任何內容匹配i,因此s的值爲0或更多,然後g。 「Article is good」無法匹配,因爲它在s之後有一個空格,而不是g。模式is\s*g匹配,因爲\s是一種與任何類型的空白相匹配的特殊模式 - 所以總體模式是is,然後是任意數量的空格,然後g,它自然匹配「is g」。

+0

哦......是的,我現在明白了。謝謝。 – Richeek 2012-01-07 01:21:00

+0

s *意思是0或更多的重複s不是空間,因此它不會匹配空間! – Richeek 2012-01-07 01:24:31

3

我看不出有什麼igisgissgissssg在你輸入...

因爲我不知道你想匹配的內容,這是我最好的猜測:

grep -P "is.*g" test.txt 
+0

是的,我感到困惑。現在我明白了。 – Richeek 2012-01-07 01:21:55

0

這是0或以前的正則表達式原子更多的重複,而原子是\s 。所以\s*可以匹配tab-space-tab-space-space。