2017-09-20 4 views
0

GREPを使用してファイルから複数行レコードを選択しようとしています。GREPで複数の n文字を使用できない理由

レコードは、私はPerlの正規表現(-P)を使用していますその

########## 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> 

のようなものを見て。

GREPで複数の行制限をバイパスするには、grep -zoを使用します。このようにして、パーサーは複数の行を消費し、正確に出力します。一般的に、それは正常に動作します。

ただし、ここでの区切り文字は、最後のレコード行の最後の2つの空白行です(3つの連続した '\ n'文字:終了行と空白行の2つです)。

私はそれが何も返さない

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'とします。 –

関連する問題