2013-10-22 180 views
1

我可以使用什麼模式來查找某行中有n個單詞長度的單詞?正則表達式中的單詞

我想這樣做的:

grep -ni ' '[a-z][a-z][a-z][a-z][a-z][a-z]' ' filename 

但是,這並不需要在該行的開頭或結尾匹配6個字母的單詞的照顧。 有沒有辦法匹配spacebeginning/end of a line?還有一種方法可以查找n次模式[a-z],而不是再次輸入n次?

我知道^用於行尾,$用於行尾。

比如我想要的一些僞腳本:

#match a word of n length(n consecutive letters) 
grep -ni^OR [:space:][a-z]{n consecutive times}[:space:] OR $ filename 

回答

3

GNU的grep有開始-的字和結束字匹配運營商\<\>

{N}重複結合這意味着你可以使用

egrep -i '\<[a-z]{6}\>' 

或者,有點難以閱讀但也許更便攜,可以使用交替操作|爲貴「或」 S並用括號:

egrep -i '(^|[[:space:]])[a-z]{6}([[:space:]]|$)' 

你應該知道這些方法之間的行爲差​​異的。單詞邊界出現在標點符號上,而不僅僅是空格,所以如果您使用\<\>(或perl-ish \b\b這是GNU grep的新增功能),那麼您還將在句子結尾處匹配單詞,由一個點而不是一個空間。

這可能是好的,但那個壞的一面是你也會匹配wouldn't,因爲wouldn是6個字母,撇號是一個字邊界。

2

此正則表達式:

\b\w{6}\b 

...相匹配的單詞邊界(其可以是一個像[a-z]單詞字符及類似' '非字字符,或開始或結束之間的過渡行),後面是六個單詞字符,後面是另一個單詞邊界。你需要egrepgrep -E,因爲{6}擴展正則表達式語法:

egrep -ni '\b\w{6}\b' filename 

你可以用[a-z]取代\w如果你不想匹配的數字和下劃線(其中\w一樣)。

+0

grep不是perl;爲什麼不'''\ <' and '\>'?它們看起來比'\ b'好,你正在做一些不可移動的東西。 –

+0

@ WumpusQ.Wumbley我碰巧習慣於'\ b'(作爲一個Pythonista,而不是Perlmonger),所以首先想到了它。我不打擾我的答案,因爲你的(upvoted)涵蓋了它。 –

1

大多數grep實現都有-w選項,無論匹配的子字符串是在行的開始位置,還是在非單詞組成字符的前面,或者在行的末尾或後面跟着非單詞組成字符。字構成字符是字母,數字和下劃線,至少在我正在使用的grep的實現中。

所以:

$ egrep -wi '[a-z]{6}' filename 

這樣您就需要字邊界,這在我的經驗是不grep的一貫支持。 (-i選項使匹配不區分大小寫。)

我們使用egrep而不是grep來評估「擴展」正則表達式而不是「基本」正則表達式。幾乎每一個grep都會理解這兩個。如果您對可移植性感興趣,請避免使用PCRE(grep -P)。