2012-10-23 50 views
1

我試圖編寫一個grep(或egrep)命令,它將查找並打印包含相同的小寫字母連續三次的「words.txt」中的任何行。三次出現的字母可能會連續出現(如在「mooo」中)或被一個或多個空格分隔(如「x x x」),但不會被任何其他字符分隔。使用grep檢測重複的字符

words.txt包含:

The monster said "grrr"! 
He lived in an igloo only in the winter. 
He looked like an aardvark. 

這就是我認爲的命令應該是:

grep -E '\b[^ ]*[[:alpha:]]{3}[^ ]*\b' 'words.txt' 

雖然我知道這是不對的,但我不知道足夠的語法弄明白。使用grep,有人可以幫助我嗎?

回答

4

這是否適合您?

grep '\([[:lower:]]\) *\1 *\1' 

它需要一個小寫字母[[:lower:]]並記住它\(... \)。它比嘗試匹配任何數量的空格_*(包括0),被記住的字符\1,任何數量的空格,被記住的字符。就是這樣。

您可以嘗試使用--color=auto來運行它,以查看它匹配的輸入的哪些部分。

+0

是的,確實有效。我清楚地意識到[[:lower:]]的意義,「之前」和「之後」都記得它。 * \ 1意味着一個被記住的角色? – Unknown

+0

@BernieMacinflor:我添加了解釋。 '\ 1'表示第一個記住的字符,'_ *'表示任意數量的空格。 – choroba

+0

我在解釋中使用了'_'而不是空格,因爲我無法獲取反引號的空格。 – choroba

0

試試這個。請注意,這將與「mooo」不匹配,因爲字邊界(\b)出現在「m」之前。

grep -E '\b([[:alpha:]]) *\1 *\1 *\b' words.txt

[:alpha:]是一個字符類的表達。要用作正則表達式字符集,它需要額外的括號。您可能已經知道這一點,因爲它看起來像你開始這樣做,但留下了敞開的支架。