2012-03-03 38 views
7

我有這樣的:用grep匹配線的模式只有一次

echo 12345 | grep -o '[[:digit:]]\{1,4\}' 

其中給出這樣的:

1234 
5 

我明白髮生了什麼。如何阻止grep在1次成功匹配後繼續匹配?

我怎麼只得到

1234 

回答

5

你需要做的分組:\(...\)隨後發生的確切數字:\{<n>\}做的工作:

maci:~ san$ echo 12345 | grep -o '\([[:digit:]]\)\{4\}' 
1234 

希望它能幫助。乾杯!!

7

你想grep來停止匹配還是你只關心第一場比賽。你可以使用head如果是後者是真實的......

`grep stuff | head -n 1` 

grep的是基於UTIL所以-m 1標誌告訴grep的一條線來阻止它的第一當其與頭部結合匹配之後是相當不錯的實踐。

+0

This Works!但是如果發現第一次匹配後我怎麼才能真正阻止grep匹配?只是好奇。 – abc 2012-03-03 03:41:45

+0

-m在找到第一個匹配項後不會停止grep匹配。 – abc 2012-03-03 03:42:41

+0

起初,我編輯了我的答案,包括-m標誌,這是你在你的問題中已經有的,ug。使用-m 1會將搜索限制在找到的第一行,而head將會在實踐中過濾哪一個應該很好。 – 2012-03-03 03:43:47

2

使用sed,而不是grep

echo 12345 | sed -n '/^\([0-9]\{1,4\}\).*/s//\1/p' 

這最多匹配4個數字在該行的開頭,後跟任何東西,只保留了數字,並打印它們。 -n防止以其他方式打印行。如果數字字符串也可能出現在中線,那麼您需要稍微複雜一點的命令。

其實,最理想是您使用與PCRE正則表達式sed,因爲你真的需要一個非貪婪匹配。然而,到一個合理的近似,您可以使用:(!一種半的解決方案是一個複雜得多的問題......現在去除

既然你要對多達4個數字的第一串線路,只需使用sed,以消除任何非數字字符,然後打印數字串:

echo abc12345 | sed -n '/^[^0-9]*\([0-9]\{1,4\}\).*/s//\1/p' 

這種非數字後跟1-4位之後的任何一個字符串匹配,只保留了數字,並打印他們。

+0

'sed's/^ [^ 0-9] * \([0-9] \ {1,4 \} \)。*/\ 1/p; d''可能不太忙? – potong 2012-03-03 09:52:39

0

如果 - 在你的榜樣 - 你的數字表達式將出現在你開始用字符串的開頭,你可以只添加啓動的行一個錨^

echo 12345 | grep -o '^\([[:digit:]]\)\{1,4\}' 

根據您想要的確切位數,行尾錨點$也可能有所幫助。