我知道这样的问题以前已经被问过很多次了,我之所以再次来到这里,是因为我觉得我错过了一些简单而根本的东西。
是否有可能使这种搜索-替换例程更好。例如,不打开同一个文件两次。也欢迎速度相关的建议。
请注意,这适用于多行匹配,也可以替换多行字符串。
#!/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;
6条答案
按热度按时间q3aa05251#
这种搜索和替换可以用一行程序来完成,例如-
更多的方法来完成同样的事情检查这个thread.要处理多行搜索使用以下命令-
为了将下面的代码从一行程序转换为perl程序,请看一下perlrun documentation。
如果您真的需要将其转换为一个工作程序,那么就让Perl为您处理文件的打开/关闭。
然后,可以使用文件名作为第一个参数来调用脚本
如果你想要一个更丰富的脚本来处理文件的打开/关闭操作(我们不是喜欢所有那些'die'语句吗),那么看看perlrun中-i[extension]开关下的例子。
tkclm6bt2#
从评论中提取简短的答案,对于任何寻找快速一行程序的人,以及Perl从命令行忽略RegEx选项的原因。
perl -0pe 's/search/replace/gms' file
如果没有
-0
参数,Perl将处理数据line-by-line,这将导致多行搜索失败。cgfeq70w3#
考虑到你在文件的整个内容中发出声音:
然后用
$string
做所有的处理,你如何处理文件和你如何处理内容之间没有联系。如果你在阅读完文件之前打开文件进行写操作,你会有一个问题,因为打开一个文件进行写操作会创建一个新文件,丢弃以前的内容。如果你想做的只是保存open/close语句,那么按照Jonathan Leffer的建议去做。如果你的问题是关于多行搜索和替换,那么请澄清问题所在。
zpgglvta4#
你可能想看看我的Perl脚本,它是经过战斗测试的(在生产中大量使用),并且有很多功能,例如:
https://github.com/tilo/replace_string
fquxozlt5#
bash脚本+ perl -pi -e的组合是无与伦比的-一个bash函数的例子,可以直接在EOF标签之前输入搜索和替换字符串:
wz8daaqr6#
我知道这个问题已经得到了回答,但这就是我解决这个问题的方法。
假设你想改变一个UUID,但是上面的行必须有一个匹配,因为你有很多属于其他东西的UUID。
Ubuntu 20中的bash脚本中的perl调用:
test.txt文件如下所示:(我知道不是有效的XML,但只需创建它)
这里发生了很多事情,但让我解释一下。
1.创建一个新的UUID来替换。
1.导出UUID,因为perl将在ENVIRONMENT变量中获取它。
1.调用Perl来处理搜索和替换
不管怎样,希望这对某人有帮助。