pcregrepは、必要なものより1行を食べる複数行の正規表現を除外します。

pcregrepは、必要なものより1行を食べる複数行の正規表現を除外します。

バナナ行で始まるすべての行bananaと、バナナ行の後にスペースで始まるすべての行をフィルタリングしたいと思います。を使用していますpcregrep。次のファイルを検討してくださいfruits.txt

apple
banana starts matching
 this line should match
 this too
 and this
mango
pomelo

pcregrep私が探していたものを見つけてうれしいです。

ars@ars-thinkpad ~/tmp/tmp $ pcregrep -M  'banana.*\n(\s.*\n)*' fruits.txt 
banana starts matching
 this line should match
 this too
 and this

ところがこのセリフを除外しようとするとマンゴーも食べることにpcregrepなって良くありません。

ars@ars-thinkpad ~/tmp/tmp $ pcregrep -M -v 'banana.*\n(\s.*\n)*' fruits.txt 
apple
pomelo

なぜ?

ベストアンサー1

正規表現で使用することは、式が改行文字を食べることが\sできることを意味します。私は-vpcregrepの実装に慣れていないので、なぜその逆ではないのかわかりませんが、その理由は明らかです。

ファイルを次のように変更する場合:

apple
banana starts matching
 this line should match
 this too
 and this

mango

pomelo

そうでなくても、-v試合は好きなように見えません。

$ pcregrep  -M 'banana.*\n(\s.*\n)*' fruits.txt
banana starts matching
 this line should match
 this too
 and this

mango

pomelo

一致する必要がある行の先頭に実際にスペースが1つしかない場合は、スペース\sを1つ以上に変更します" +"

正規表現を'banana.*\n( +.*\n)*' Itに変更すると、より正確であると考えられる方法(正規と逆)に一致します。[ \t]+タブも許可すると機能します。

おすすめ記事