多次从多个文件中删除多行

时间:2016-06-30 19:21:37

标签: regex perl

我有几个文件(*.txt),我需要从中删除行。文件如下所示:

This is a line to keep.
keep me too
START
some stuff to remove
other to remove
END
keep me!

我希望他们看起来像这样:

This is a line to keep.
keep me too
keep me!

我已经走到这一步了:

perl -i -p0e 's/#START.*?END/ /s' file.txt

哪个会从file.txt删除该第一个实例,但我无法弄清楚如何从file.txt删除所有实例(以及如何将其应用于所有*.txt文件?)

3 个答案:

答案 0 :(得分:4)

如果您显示的内容适用于第一个实例,那么您需要添加的是/g标志来执行所有实例,以及一个shell glob来挑选所有.txt文件:

perl -i -p0e 's/#START.*?END/ /gs' *.txt

答案 1 :(得分:3)

这似乎适用于 flip-flop operator

#!/usr/bin/env perl

use strict;
use warnings;

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

__DATA__
This is a line to keep.
keep me too
START
some stuff to remove
other to remove
END
keep me!

输出:

This is a line to keep.
keep me too
keep me!

它也可以写成一行:

perl -n -e 'print unless (/^START/ .. /^END/);' input.txt > output.txt

或者,就地编辑文件:

perl -n -i -e 'print unless (/^START/ .. /^END/);' *.txt

答案 2 :(得分:1)

这里需要处理的记账事项是打开和写入单个文件。处理本身由range operator处理。

use warnings;
use strict;

my @files = @ARGV;

my ($fh_in, $fh_out);

foreach my $file (@files) 
{
    my $outfile = "new_$file";

    open $fh_in, '<', $file  or die "Can't open $file: $!";
    open $fh_out, '>', $outfile  or die "Can't open $outfile: $!";

    print "Processing $file, writing to $outfile.\n";

    while (<$fh_in>) {
        print $fh_out $_ if not /^START$/ .. /^END$/;
    }
}

这被调用为script.pl file-list

由于我们使用相同的文件句柄进行阅读(以及相同的文件句柄),因此当打开新文件时,前一个文件将关闭,请参阅perlopentutopen。所以我们没有close

  

如果您要立即打开另一个FILEHANDLE,则不必关闭FILEHANDLE,因为open会为您关闭它。 (见开放。)

我将新文件命名为new_$file,只是为了提供工作示例。例如,您可以在$file.orig循环之后将旧版本重命名为$file,将新版本重命名为while。我将使用核心File::Copy模块中的函数。在这种情况下,我们需要首先显式关闭文件。