2012-09-29 12 views
52

如何在grep中給出新行的模式? 開始新行,結束新行。不是正則表達式的方式。像\ n。如何在grep中爲新行添加模式?

+6

目前尚不清楚你想要什麼。 '開頭的新行'是一個空行,'end end'換行適用於文件中的每一行。你能舉一個例子嗎? –

+0

其實你可以使用'$'。這是有限的,但在簡單的情況下可用。 –

+0

https://www.gnu.org/software/grep/manual/grep.html#Usage見條目15. – jarno

回答

54

grep模式匹配個別行,所以模式無法匹配輸入中找到的換行符。

但是你可以找到空行是這樣的:

grep '^$' file 
grep '^[[:space:]]*$' file # include white spaces 
+0

至少GNU grep有-z選項,它使grep斷行由空字符組成。但是,它似乎不支持換行符或換行符匹配換行符,請參閱[bug報告](https://bugs.launchpad.net/ubuntu/+source/grep/+bug/1641092)。 – jarno

+0

@jarno它支持\ n模式中的-P標誌 – rubystallion

10

您可以用這種方式...

grep -P '^\s$' file 
  • -P用於Perl的正則表達式(擴展到POSIX grep )。
  • \s匹配空白字符;如果跟着*,它也匹配一個空行。
  • ^匹配行的開頭。 $匹配該行的結尾。
+1

'-P'是一個GNU擴展。我很喜歡在情況需要時使用它(通常是前瞻/後視),但是POSIX grep可以用'[[:space:]]'來完成這個文件。 – jordanm

+1

FWIW,Solaris和BSD的grep manpages(沒有檢查其他人)都有'-P'的段落。無論如何,GNU是非常標準的。 :) –

+0

+1 for perl regex :) – mattexx

59

嘗試pcregrep代替普通grep

pcregrep -M "pattern1.*\n.*pattern2" filename 

-M選項允許它在多個線路匹配,這樣你就可以搜索換行符\n

+0

正是我在找,謝謝! – yorch

3

至於解決方法(不使用非便攜-P),您可以臨時使用不同的字符替換新線,改變回來,如:

grep -o "_foo_" <(paste -sd_ file) | tr -d '_' 

凡在尋找精確匹配_foo_其中_手段\n(所以__ = \n\n)。您無需將其翻譯回tr '_' '\n',因爲每個圖案都會以新行打印,因此刪除_就足夠了。

0

感謝@jarno我知道-z選項,我發現當使用GNU grep和-P選項時,\n匹配是可能的。 :)

例子:

grep -zoP 'foo\n\K.*'<<<$'foo\nbar'

打印bar

相關問題