2013-11-09 229 views
1

我在使用grep時遇到了以下問題:\{n\}\{n,\}\{n,m\}。我有一個名爲「新」與此行的文件:Linux Shell - Grep命令

aaaa 
aaa 
aa 
a 

當我使用grep 'a\{1\}' new我得到這個輸出:

aaaa 
aaa 
aa 
a 

所以,基本上,這個命令會告訴我,其中包括1線,或更多,連續出現的字符「a」是正確的?

另外,grep 'a\{1,\} new會做與grep 'a\{1\}' new相同的事情嗎?因爲我得到了兩個相同的輸出。

最後一個,\{n,m\},我真的不明白它的作用。

如果有人能幫助我,我會很感激。

回答

2

man grep

Repetition 
     A regular expression may be followed by one of several repetition 
     operators: 
     ?  The preceding item is optional and matched at most once. 
     *  The preceding item will be matched zero or more times. 
     +  The preceding item will be matched one or more times. 
     {n} The preceding item is matched exactly n times. 
     {n,} The preceding item is matched n or more times. 
     {n,m} The preceding item is matched at least n times, but not more 
       than m times. 

即例如grep 'a\{2,3\}' new匹配也與aaaa因爲前三(或2)a線。其餘部分並不重要。

如果您希望確實只有2個或3個連續的a匹配,您可以使用-o標誌。但請注意,這將從aaaaa的行中輸出aaaaa。爲避免這種情況,您必須使用其他信息,如示例中的換行符^$

Btw。我會建議使用-E標誌(或egrep這是相同的),所以你有擴展的正則表達式支持。那麼你不必跳過括號。

對於輸入

aaaaa 
aaaa 
aaa 
aa 
a 

grep -o -E '^a{2,3}$'通話會給輸出:

aaa 
aa 
+1

非常感謝!傑出的答案! –

+0

感謝您的額外信息。我其實正在搜索有關grep -E的信息!非常感謝! –

+0

Yor're歡迎:) – EverythingRightPlace

2

grep 'a\{n,m\}' new表示從新增至少n個a和至多m個a
例如,grep 'a\{2,3\}' new將輸出

aaaa 
aaa 
aa 

最後一行亙古不匹配,因爲它只有一個a
對於a{n,\}',省略m表示任何大於或等於n的數字。

+1

@Exsound這是正常的,因爲'aaaa'確實含有1或2或3'a's.Thus它的印刷。事實上,對於'a \ {1,3 \'',任何只包含一個'a'的行都會被打印出來。 – yakiang