2011-10-29 22 views
2

看看下面的例子,其中grep使用二進制模式進行搜索:Grep:在二進制模式下重複字符?

$ echo "test blabla test ertytey" | grep -ao tes 
tes 
tes 

我可以在搜索模式添加一個「點」,以「匹配任何字符」,並在賽後表示下一個字符:

$ echo "test blabla test ertytey" | grep -ao tes. 
test 
test 

...或多個點,以配合後續字符:

$ echo "test blabla test ertytey" | grep -ao tes... 
test b 
test e 

 

現在我想說匹配後匹配多個字符(,比如說30,no:3)我從man grep讀取:{n} The preceding item is matched exactly n times.。所以我嘗試:

$ echo "test blabla test ertytey" | grep -ao tes.{3} 
$ 

......什麼也沒有發生;

$ echo "test blabla test ertytey" | grep -ao tes.\{3\} 
$ 

......什麼也沒有發生;

$ echo "test blabla test ertytey" | grep -ao tes[.]\{3\} 
$ 

......什麼也沒有發生;

$ echo "test blabla test ertytey" | grep -ao tes\[.\]\{3\} 
$ 

......沒有任何反應。

 

任何想法,將正確的語法是什麼「任何字符」(點),一個給定的次數中的grep的二進制模式匹配嗎?

非常感謝任何答案,
乾杯!

 

編輯:爲@aix的回答指出,最初我做了指定30個字符搜索的失誤,而本例中的字符串不夠長:)現在已經改成了更合理的計數3 :)

+2

強烈建議您包裝圖案單引號,以防止某些字符的不必要猛砸擴張。 – heltonbiker

+0

已確認 - 感謝那個@heltonbiker,好的答案也反映了這一點;乾杯! – sdaau

回答

4

首先,{30}匹配正好三十個字符,並且你的字符串不夠長。

其次,您的grep可能需要-E標誌來啓用擴展語法(我的確)。

對我來說,以下工作:

$ echo "test blabla test ertytey" | grep -aoE 'tes.{20}' 
test blabla test ertyte 
+2

'egrep'有時也可用並且等同於'grep -E'。 – Mat

+2

是的,你必須至少有指定數量的字符在你的strig中,否則將不匹配。如果你想在30個字符以內,你可以使用'grep -aoE'tes。{1,30}'',這意味着tes後跟一個最多30個字符。值得注意的是,'grep -E'相當於'egrep'。 – heltonbiker

+0

真棒,非常感謝您的答案!另外,對不起,我正在寫OP太快了 - 現在修改了正確的字符...再次感謝,所有 - 乾杯! – sdaau

1

echo "test blabla test ertytey" | grep -aoE 'tes.{3}l'

+0

非常感謝那@Michel - 歡呼! – sdaau