1

start キーワードと end キーワードによって決定されるファイル内の行のブロックを見つけて、このブロックを削除できるようにしたいと考えています。このブロックを見つけるために「if (/START/../END/)」を使用していますが、このブロック内の行を削除する方法がわかりません。これを達成するために、上記の「if」内でどのステートメントを使用できますか?

注: 真の削除である必要はありません。つまり、行を空のスペースに置き換えるだけです。

PS: 私は初めての perl ユーザーであり、これがばかげた質問のように思われる場合はご容赦ください。同様の質問がたくさんあることは知っていますが、インプレース削除を扱っている人は誰もいないようで、目的のブロックを除いてファイル全体を別のファイルに出力するなどのオプションを提案していません。

4

3 に答える 3

4

Perlはこれを非常に簡単にします。

1行、との間の行を削除しpattern1ますpattern2

perl -i -ne 'print unless /pattern1/../pattern2/' input_file

perlrunperlのさまざまなコマンドラインスイッチを理解するために参照してください

于 2012-08-23T19:40:45.317 に答える
2

ロジックを逆にすることができます:

use warnings;
use strict;

while (<DATA>) {
    print unless /START/ .. /END/;
}

=for output

foo
bar

=cut


__DATA__
foo
START
goo
END
bar
于 2012-08-23T19:39:24.633 に答える
1

sed付き:

sed '/START/,/END/d' input_file

元のファイルを変更するには:

sed -i '/START/,/END/d' input_file
于 2012-08-23T19:41:25.253 に答える