2009-09-29 70 views
9

嗯,我有test.txt的如何讓grep在第一場比賽中停下來?

 
#test.txt 
odsdsdoddf112 test1_for_grep 
dad23392eeedJ test2 for grep 
Hello World test 
garbage 

我想提取其中後他們已經得到了空間的字符串的文件。我用下面的表達式,它的工作

 
grep -o [[:alnum:]]*.[[:blank:]] test.txt 

它的輸出是

 
odsdsdoddf112 
dad23392eeedJ 
test2 
for  
Hello 
World 

但問題是grep的印刷品,經過他們已經得到了空間的所有字符串,在這裏,我希望它在第一場比賽後停止一條線,然後進入第二線。

我應該在這裏使用哪種表達方式,以便在第一次匹配後停止並移至下一行?

這個問題可以用gawk或其他工具來解決,但是我會理解一個只使用grep的解決方案。

編輯 我在Linux系統上使用GNU grep 2.5.1,如果這是相關的。

編輯

下面給出的答案的幫助下,我想我的運氣

 
grep -o ^[[:alnum:]]* test.txt 
grep -Eo ^[[:alnum:]]+ test.txt 

無一不給了我正確的答案。

現在是什麼讓我驚訝的是,我試圖用

 
grep -Eo "^[[:alnum:]]+[[:blank:]]" test.txt 

的建議here但沒有得到正確的答案。 這裏是我的終端上的輸出

 
odsdsdoddf112 
dad23392eeedJ 
test2 
for  
Hello 
World 

但從RichieHindle和阿德里安·普龍克的意見,說明他們得到了在他們的系統正確的輸出。任何人有一些想法,爲什麼我也沒有得到我的系統相同的結果。任何想法?任何幫助將不勝感激。

編輯

嗯,看來grep的2.5.1有一些bug,因爲這是我的輸出是不正確的。我安裝了grep 2.5.4,現在它工作正常。詳情請參閱this link

回答

7

如果你確定你有沒有前導空格,加^僅在一行的開始匹配,並改變當你有一個或多個字母數字字符的*+只匹配。 (這意味着添加-E以使用擴展正則表達式)。

grep -Eo "^[[:alnum:]]+[[:blank:]]" test.txt 

(我也刪除從中間.,我不知道是什麼在那裏做什麼?)

+0

我複製你的命令到我的終端,但得到了完全相同的結果。 – 2009-09-29 22:31:43

+1

@ andrew-dufresne:你的文本文件有些奇怪嗎?試試'od -c test.txt'這是否顯示你期待看到的角色? – RichieHindle 2009-09-29 22:34:27

+0

@RichieHindle:感謝您的及時回覆,我真的很感激。我執行命令,並得到了相同的字符,在test.txt的 – 2009-09-29 22:40:53

1
grep -oe "^[^ ]* " test.txt 
+0

我粘貼了你的命令,並得到了與前面相同的結果。 – 2009-09-29 22:32:31

+1

嗯 - 我的作品與GNU Grep 2.5.3(Ubuntu Hardy) – BryanH 2009-09-30 21:26:50

+0

你是對的。我的grep版本2.5.1是罪魁禍首。安裝2.5.4並且你的表達式工作。非常感謝BryanH。我感謝您的幫助。 – 2009-10-01 03:15:18

0

如果我們要提取垃圾之前的所有有意義的投入,實際上停止對第一場比賽,然後-B NUM, --before-context=NUM選擇可能是「匹配行之前領先的情況下打印張數行」有益的。

實施例:

grep --before-context=999999 "Hello World test" 
2

由於發現了提問者,這是在GNU的grep版本2.5.3一個bug之前。該錯誤允許插入符號在前一次比賽結束後匹配,而不僅僅是在行首。

此錯誤仍存在於其他版本的grep中,例如Mac OS X 10.9.4中。

沒有一個通用的解決方法,但在一些示例中,如非空格後跟一個空格,通常可以通過關閉分隔符來獲得所需的行爲。也就是說,搜索'[^ ]*'而不是'[^ ]* '

+0

發佈此信息作爲答案,以便更容易找到此信息。 – 2014-08-22 13:29:39

相關問題