私は定期的に正規表現を使用してテキストを変換しています。
コマンド ラインから巨大なテキスト ファイルを変換するには、perl で次のようにします。
perl -pe < in.txt > out.txt
しかし、これは本質的に行ごとに行われます。ときどき、複数行のものを照合したいことがあります。
コマンドラインでこれを行うにはどうすればよいですか?
私は定期的に正規表現を使用してテキストを変換しています。
コマンド ラインから巨大なテキスト ファイルを変換するには、perl で次のようにします。
perl -pe < in.txt > out.txt
しかし、これは本質的に行ごとに行われます。ときどき、複数行のものを照合したいことがあります。
コマンドラインでこれを行うにはどうすればよいですか?
行の境界を越えて検索する
したがって、行の境界を越えてgrepしたい...
すでにpcregrep
インストールされている可能性があります。ご存じかもしれませんが、PCRE は の略でPerl-Compatible Regular Expressions
、ライブラリは Perl と同じではありませんが、間違いなく Perl スタイルです。
複数行にわたって一致させるには、複数行モードをオンにする必要がありますが-M
、これは複数行モードとは異なります。(?m)
ランニングpcregrep -M "(?s)^b.*\d+" text.txt
このテキスト ファイルについて:
a
b
c11
出力は次のようになります。
b
c11
一方、grep は空を返します。
ドキュメントからの抜粋:
-M, --multiline パターンが複数行に一致することを許可します。このオプションが指定された場合、パターンにはリテラルの改行文字と内部で出現する ^ および $ 文字を含めることができます。一致が成功した場合の出力は複数の行で構成される場合があり、その最後の行は一致が終了した行です。一致した文字列が改行シーケンスで終わる場合、出力はその行の終わりで終了します。
このオプションが設定されている場合、PCRE ライブラリは「複数行」モードで呼び出されます。pcgrep がスキャン時に入力ファイルをバッファリングする方法によって課せられる、照合できる行数には制限があります。ただし、pcgrep は、少なくとも 8K 文字またはドキュメントの残り (いずれか短い方) が前方一致に使用できることを保証し、同様に、前の 8K 文字 (または、8K 未満の場合は前のすべての文字) が使用されます。後読みアサーションで使用できることが保証されています。このオプションは、入力が 1 行ずつ読み取られる場合には機能しません (--line-buffered を参照してください)。