2017-09-20 77 views
0

我正在嘗試使用GREP從文件中選擇多行記錄。爲什麼GREP無法容忍多個 n字符

的記錄看起來就像是

########## Ligand Number :  1 
blab bla bla 
bla blab bla 


########## Ligand Number :  2 
blab bla bla 
bla blab bla 


########## Ligand Number :  3 
bla bla bla 


<EOF> 

我使用Perl的正則表達式(-P)。

繞過GREP多行限制,我使用grep -zo。這樣,解析器可以消耗多行並輸出我想要的。一般來說,它工作正常。

然而,問題是分隔符這裏是最後的記錄行結束後兩個空行(三連冠「\ n」字符:一個是端線和兩個用於兩個空行)。

當我嘗試使用表達式像

grep -Pzo '^########## Ligand Number :\s+\d+.+?\n\n\n' inputFile 

它沒有返回。看起來,grep不能容忍連續的'\ n'字符。

有人可以給一個解釋嗎?

P.S.我已經繞過它,先將'\ n'字符翻譯爲'\ a',然後將它們翻譯回來。這樣下面的例子:

cat inputFile | tr '\n' '\a' | grep -Po '########## Ligand Number :\s+\d+\a.+?\a\a\a' | tr '\a' '\n' 

但是我需要了解爲什麼不能grep的理解 '\ n \ n \ n' 模式。

+0

在開始處添加'(?s)',或用'[\ s \ S]'替換'.'。在PCRE正則表達式中,'.'默認不符合換行符號,'s'修飾符使POSIX像點行爲一樣。 –

+0

@WiktorStribiżew 請仔細閱讀我的問題,直到最後。我清楚地問:「爲什麼GREP無法理解'\ n \ n \ n'模式? –

+0

電腦無法「理解」任何東西。引擎是否匹配一個字符串。 PCRE正則表達式中的'.'與'\ n'不匹配。 –

回答

1

在PCRE正則表達式中,.默認情況下不符合換行符號,s修飾符啓用POSIX類似點行爲。

因此,在開始時添加(?s),或者用[\s\S]替換.

(?s)^########## Ligand Number :\s+\d+.+?\n\n\n 
+0

你說得對。問題沒有被解析「\ n \ n \ n」的模式,但在解析/理解/匹配的內部「」如'\ n'。 –

相關問題