3

準標準ヘッダーを含むファイルがたくさんあります。つまり、見た目は非常に似ていますが、テキストが多少異なります。

このヘッダーをすべてのファイルから削除したいと考えています。

ファイルを見ると、削除したいものが類似した単語の間にカプセル化されていることがわかります。

だから、例えば、私は持っています:

Foo bar...some text here...
more text
Foo bar...I want to keep everything after this point

私はperlでこのコマンドを試しました:

perl -pi -e "s/\A.*?Foo.bar*?Foo.bar//simxg" 00ws110.txt

しかし、うまくいきません。私は正規表現の専門家ではありませんが、文字数ではなくテキスト一致に基づいてファイルの先頭からテキストのチャンクを基本的に削除する方法を誰かが知っていることを願っています...

4

4 に答える 4

7

デフォルトでは、 (舞台裏で によって使用されるARGV別名) は、一度に 1 行しか読み取りません。<>-p

回避策:

  1. Unset $/。一度にファイル全体を読み取るように Perl に指示します。

    perl -pi -e "BEGIN{undef$/}s/\A.*?Foo.bar*?Foo.bar//simxg" 00ws110.txt
    

    BEGIN最初の読み取りが完了する前にそのコードを実行する必要があります。

  2. -0を設定する を使用します$/ = "\0"

    perl -pi -0 -e "s/\A.*?Foo.bar*?Foo.bar//simxg" 00ws110.txt
    
  3. フリップフロップ演算子を利用します。

    perl -ni -e "print unless 1 ... /^Foo.bar/'
    

    これにより、行 1 から までの印刷がスキップされ/^Foo.bar/ます。

于 2009-03-23T20:42:27.203 に答える
3

ヘッダーが複数行にまたがっている場合は、perlに読み取る量を指示する必要があります。ファイルがメモリと比較して小さい場合は、ファイル全体をメモリに丸呑みするだけです。

perl -0777pi.orig -e 's/your regex/your replace/s' file1 file2 file3

この-0777オプションはperlをslurpモードに設定するため$_、ループを通過するたびにファイル全体を保持します。また、常にバックアップ拡張子を設定することを忘れないでください。そうしないと、誤ってデータを消去してしまい、元に戻す方法がないことに気付く場合があります。詳細については、を参照perldoc perlrunしてください。

コメントからの情報を考えると、 ProjectGutenbergの電子ブックの前面から迷惑なものをすべて取り除こうとしているようです。関連する著作権の問題をすべて理解していれば、次のような前書きを取り除くことができるはずです。

perl -ni.orig -e 'print unless 1 .. /^\*END/' 00ws110.txt

ProjectGutenbergヘッダーはで終わります

*END*THE SMALL PRINT! FOR PUBLIC DOMAIN ETEXTS*Ver.04.29.93*END*

*END*より安全な正規表現では、行末のも考慮されますが、私は怠け者です。

于 2009-03-23T20:49:20.603 に答える
2

私はあなたが求めていることを誤解しているかもしれませんが、私にはとても単純に見えます:

perl -ni -e 'print unless 1..($. > 1 && /^Foo bar/)'
于 2009-03-23T21:19:35.447 に答える
0

どうぞ!これにより、ファイルの最初の行が置き換えられます。


use Tie::File;

tie my @array,"Tie::File","path_to_file" or die("can't tie the file");
$array[0] =~s/text_i_want_to_replace/replacement_text/gi;
untie @array;

アレイを操作すると、アレイ内の変更が表示されます。配列から要素を削除すると、ファイルから行が消去されます。要素に置換を適用すると、行のテキストが置換されます。

最初の 2 行を削除し、3 行目から何かを残したい場合は、次のようにすることができます。


# tie the @array before this
shift @array;
shift @array;
$array[0]=~s/foo bar\.\.\.//gi;
# untie the @array

そして、これはあなたが必要とすることを正確に行います!

于 2009-03-23T20:29:20.200 に答える