我有几个文件(*.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
文件?)
答案 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
。
由于我们使用相同的文件句柄进行阅读(以及相同的文件句柄),因此当打开新文件时,前一个文件将关闭,请参阅perlopentut
和open
。所以我们没有close
如果您要立即打开另一个FILEHANDLE,则不必关闭FILEHANDLE,因为open会为您关闭它。 (见开放。)
我将新文件命名为new_$file
,只是为了提供工作示例。例如,您可以在$file.orig
循环之后将旧版本重命名为$file
,将新版本重命名为while
。我将使用核心File::Copy
模块中的函数。在这种情况下,我们需要首先显式关闭文件。