上下文:我是Perl的初学者并且在努力,请耐心等待,谢谢。
问题:有一个单线程似乎可以完成我想要的工作(在cygwin控制台中,它在我的测试文件中运行良好)。所以现在我需要把它变成一个脚本,但不幸的是我无法管理它。
的答案中提供了有问题的单行班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);
非常感谢提前!
答案 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
使用我在顶部显示的脚本文件。