这是0700的question。我们是importing the perlfaq to Stack Overflow。
解决方法
从文本文件中插入,更改或删除行的基本思想
涉及阅读和打印文件到您想要的点
更改,进行更改,然后阅读并打印文件的其余部分。
Perl不提供对线路的随机访问(特别是自从记录以来
输入分隔符,$ /,是可变的),虽然模块如
Tie::File可以伪造它。
执行这些任务的Perl程序是打开文件的基本形式,
打印它的行,然后关闭文件:
open my $in,'<',$file or die "Can't read old file: $!"; open my $out,'>',"$file.new" or die "Can't write new file: $!"; while( <$in> ) { print $out $_; } close $out;
要在开始前添加行,请在输入前打印这些行
循环打印现有行。
open my $in,"$file.new" or die "Can't write new file: $!"; print $out "# Add this line to the top\n"; # <--- HERE'S THE MAGIC while( <$in> ) { print $out $_; } close $out;
要更改现有行,请插入代码以修改其中的行
while循环。在这种情况下,代码会找到所有较低版本的“perl”
并将它们加热。发生在每一行,所以请确保你是
应该在每一行上做到这一点!
open my $in,"$file.new" or die "Can't write new file: $!"; print $out "# Add this line to the top\n"; while( <$in> ) { s/\b(perl)\b/Perl/g; print $out $_; } close $out;
要更改特定行,输入行号$。是有用的。
首先阅读并打印要更改的行。接下来,阅读
您要更改的单行,更改它并打印。之后,
阅读其余的行并打印:
while( <$in> ) # print the lines before the change { print $out $_; last if $. == 4; # line number before change } my $line = <$in>; $line =~ s/\b(perl)\b/Perl/g; print $out $line; while( <$in> ) # print the rest of the lines { print $out $_; }
要跳过线,请使用循环控件。此示例中的下一个将跳过
注释行,最后停止所有处理一旦遇到
__END__或__DATA__。
while( <$in> ) { next if /^\s+#/; # skip comment lines last if /^__(END|DATA)__$/; # stop at end of code marker print $out $_; }
做同样的事情删除一个特定的行,使用下一个跳过
你不想在输出中显示这些行。这个例子跳过每一个
第五行:
while( <$in> ) { next unless $. % 5; print $out $_; }
如果由于某种奇怪的原因,您真的想要一次看到整个文件
而不是逐行处理,您可以将其剔除(只要可以)
适应整个事情在记忆中!):
open my $in,$file or die "Can't read old file: $!" open my $out,"$file.new" or die "Can't write new file: $!"; my @lines = do { local $/; <$in> }; # slurp! # do your magic here print $out @lines;
模块如File::Slurp
和Tie::File可以帮助
太。但是,如果可以,请避免立即读取整个文件。 Perl不会
将该内存返回操作系统,直到进程完成。
您也可以使用Perl one-liners来就地修改文件。下列
将所有’Fred’更改为’Barney’inFile.txt,覆盖该文件
新内容。使用-p开关,Perl围绕着代码循环一圈
你用-e指定,-i打开就地编辑。当前
行在$ _。使用-p,Perl将自动打印$ _的值
循环结束。详见perlrun。
perl -pi -e 's/Fred/Barney/' inFile.txt
perl -pi.bak -e 's/Fred/Barney/' inFile.txt
要更改第五行,您可以添加一个测试检查$。,输入
行号,然后仅在测试通过时执行操作:
perl -pi -e 's/Fred/Barney/ if $. == 5' inFile.txt
要在某行之前添加行,您可以在之前添加一行(或行!)
Perl打印$ _:
perl -pi -e 'print "Put before third line\n" if $. == 3' inFile.txt
您甚至可以在文件的开头添加一行,因为当前行
在循环结束时打印:
perl -pi -e 'print "Put before first line\n" if $. == 1' inFile.txt
要在文件中已经有一行之后插入一行,请使用-n开关。它的
就像-p一样,它不会在循环结束时打印$ _,所以
你必须自己去做。在这种情况下,首先打印$ _,然后打印
要添加的行。
perl -ni -e 'print; print "Put after fifth line\n" if $. == 5' inFile.txt
要删除行,只打印您想要的行。
perl -ni -e 'print unless /d/' inFile.txt
… 要么 …
perl -pi -e 'next unless /d/' inFile.txt