多线搜索替换为Perl

use*_*556 56 perl

我知道这种问题之前已经被问过很多次了.我再次来到这里的原因是我觉得我错过了简单而基本的东西.

是否有可能更好地进行这种搜索替换程序.例如,两次不打开相同的文件.欢迎速度相关的建议.

请注意,这适用于多行匹配并替换多行字符串.

#!/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;
Run Code Online (Sandbox Code Playgroud)

aks*_*aks 91

这种搜索和替换可以通过单线程完成,例如 -

perl -i -pe 's/START.*STOP/replace_string/g' file_to_change
Run Code Online (Sandbox Code Playgroud)

有关完成相同操作的更多方法,请查看此主题.要处理多行搜索,请使用以下命令 -

perl -i -pe 'BEGIN{undef $/;} s/START.*STOP/replace_string/smg' file_to_change
Run Code Online (Sandbox Code Playgroud)

为了将以下代码从one-liner转换为perl程序,请查看perlrun文档.

如果您确实需要将其转换为工作程序,那么让Perl为您处理文件打开/关闭.

#!/usr/bin/perl -pi
#multi-line in place substitute - subs.pl
use strict;
use warnings;

BEGIN {undef $/;}

s/START.*STOP/replace_string/smg;
Run Code Online (Sandbox Code Playgroud)

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

$perl subs.pl file_to_change
Run Code Online (Sandbox Code Playgroud)

如果你想要一个更加强大的脚本来处理文件打开/关闭操作(我们不喜欢所有那些'die'语句),那么看一下-l [extension]开关下perlrun中的例子.

  • 甚至更短的版本:`perl -i -p0e的/ START.*STOP/replace_string/smg'file_to_change`(`-0`将行分隔符设置为nul). (22认同)
  • 对于那些想知道什么是 `undef $/;` 的人。它被称为_“啜饮模式”_。更多信息[这里](http://perlmaven.com/slurp)。 (4认同)
  • 而且这似乎不适用于多行匹配 (2认同)

Bee*_*jor 37

对于那些寻找快速单行的人来说,从评论中得到简短的答案,以及Perl从命令行忽略他们的RegEx选项的原因.

perl -0pe 's/search/replace/gms' file

如果没有这个-0参数,Perl会逐行处理数据,这会导致多行搜索失败.

  • 完善.如果它似乎不起作用,请尝试使用`\ R`(匹配所有类型的行尾)而不是`\n`. (3认同)
  • 对我来说,0开关是至关重要的。谢谢,+ 1 (3认同)