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' のパターンを理解できなかった理由をを理解する必要があります。この次の例のように。
'(?s)'を先頭に追加するか、 '.'を' [\ s \ S] 'に置き換えてください。 PCRE正規表現では、 '.'はデフォルトで改行記号と一致せず、' s'修飾子はPOSIXのようなドット動作を可能にします。 –
@WiktorStribiżew 私の質問を最後まで丁寧にお読みください。私は明らかに "なぜGREPは '\ n \ n \ n'パターンを理解できなかったのですか? –
コンピュータは何も理解できません。エンジンが文字列と一致するかどうか。 PCRE正規表現の '.'は' \ n'と一致しません。 –