如何删除perl中的一堆行(适应已知的单行)?

时间:2013-09-21 15:30:42

标签: perl

上下文:我是Perl的初学者并且在努力,请耐心等待,谢谢。

问题:有一个单线程似乎可以完成我想要的工作(在cygwin控制台中,它在我的测试文件中运行良好)。所以现在我需要把它变成一个脚本,但不幸的是我无法管理它。

Aki在Delete lines in perl

的答案中提供了有问题的单行班
perl -ne 'print unless /HELLO/../GOODBYE/' <file_name>

即我想要一个打开我的文件“test.dat”的脚本,并删除一些字符串HELLO和GOODBYE之间的行。这是我尝试过的,失败了(cygwin的路径很好):

#!/bin/perl
use strict;
use warnings;

open (THEFILE, "+<test.dat") || die "error opening";
my $line;
while ($line =<THEFILE>){
next if /hello/../goodbye/;
print THEFILE $line;
}
close (THEFILE);

非常感谢提前!

1 个答案:

答案 0 :(得分:2)

您的单行相当于以下

while (<>) {
    print unless /HELLO/../GOODBYE/;
}

您的代码完全不同。您不应该尝试读取和写入相同的文件句柄,这通常不会按您的想法执行。如果要快速编辑文件,可以使用-i“就地编辑”开关:

perl -ni -e 'print unless /HELLO/../GOODBYE/' file

请注意,对文件的更改是不可逆转的,因此您应该进行备份。您可以使用该开关的备份选项,例如-i.bak,但要注意它并不完美,因为两次运行相同的命令仍会覆盖备份(通过保存两次相同的文件名)。

最简单,最安全的方法IMO就是简单地使用shell重定向

perl script.pl file.txt > newfile.txt

使用我在顶部显示的脚本文件。