多行search取代Perl

我知道这种问题以前已经被问过很多次了。 我之所以再来这里是因为我觉得我错过了一些简单而基本的东西。

是否有可能使这种searchreplace程序更好。 例如没有打开同一个文件两次。 也欢迎速度相关的build议。

请注意,这适用于多行匹配,也可以replace多行string。

#!/bin/perl -w -0777 local $/ = undef; open INFILE, $full_file_path or die "Could not open file. $!"; $string = <INFILE>; close INFILE; $string =~ s/START.*STOP/$replace_string/sm; open OUTFILE, ">", $full_file_path or die "Could not open file. $!"; print OUTFILE ($string); close OUTFILE; 

这种search和replace可以用一个单线来完成,例如 –

 perl -i -pe 's/START.*STOP/replace_string/g' file_to_change 

更多的方法来完成相同的事情检查出这个线程 。 要处理多行search,请使用以下命令 –

 perl -i -pe 'BEGIN{undef $/;} s/START.*STOP/replace_string/smg' file_to_change 

为了将以下代码从单行程序转换为perl程序,请查看perlrun文档 。

如果你真的觉得需要把它转换成一个工作的程序,那就让Perl为你处理文件的打开/closures。

 #!/usr/bin/perl -pi #multi-line in place substitute - subs.pl use strict; use warnings; BEGIN {undef $/;} s/START.*STOP/replace_string/smg; 

然后您可以使用文件名作为第一个参数来调用脚本

 $perl subs.pl file_to_change 

如果你想要一个更强大的脚本来处理文件的打开/closures操作(我们不喜欢所有那些'死'的声明),那么看看在-i [extension]开关下的perlrun中的例子。

考虑到你在文件的全部内容中啜泣:

 local $/ = undef; open INFILE, $full_file_path or die "Could not open file. $!"; $string = <INFILE>; close INFILE; 

然后用$string做所有的处理,在处理文件和处理内容之间没有任何联系。 如果在读完文件之前打开文件进行写入,则会出现问题,因为打开要写入的文件会创build一个新文件,并丢弃以前的内容。

如果你所要做的只是保存开放/closures的声明,那就照乔纳森·莱弗 ( Jonathan Leffer)的build议 。 如果你的问题是关于多行search和replace,那么请澄清是什么问题。