如何在Perl正则expression式中replace多个任意字符(包括换行符)?

这是MyTextString.txt的简化描述:

注意: BlaBla代表包括换行符的任何字符。

开始 BlaBla-In 结束 BlaBla-Out-Between 开始 BlaBla-In 结束 BlaBla-Out-Between 开始 BlaBla-In 结束 BlaBla-Out-Between 开始 BlaBla-In 结束

我在找END和START(BlaBla-Out-Between)之间的文本去除结果是这样的:

START BlaBla-In END换行START BlaBla-In END换行START BlaBla-In END换行START BlaBla-In END

我有一个perl文件changes.pl

BEGIN { @ARGV = map glob("\"$_\""), @ARGV; } s/(END).*?(START)/$1\n$2/sg; #TEST 

我应该使用这个CMD行来执行我的replace:

 perl -i.bak -p changes.pl My/File/Directory/MyTextString.txt 

注意:与其他正则expression式查找和replacestring一样, changes.plCMD行也正常运行。

但是,对于这个RegExstring,MyTextString.txt不会发生任何修改:

 s/(END).*?(START)/$1\n$2/sg; 

我认为关于我的正则expression式语法的每一件事情都可以,因为它在正则expression式101testing中运行良好。

我正在寻找使用提到的changes.plCMD行匹配和replace任何字符(包括换行符) 。 简单地说,我正在用换行符replaceBlaBla-Out-Between

Solutions Collecting From Web of "如何在Perl正则expression式中replace多个任意字符(包括换行符)?"

在进行替换之前,您需要把整个文件写入一个字符串。 -p命令行开关一次只读取一行。

这意味着替换s/(END).*?(START)/$1\n$2/sg只会在同一行中有END模式后接START模式的情况下删除任何内容。

咕噜文件你可以指定一个输入记录分隔符八进制0777

 perl -0777 -p -i.bak changes.pl MyTextString.txt 

来自perlrun :

-0 [八进制/十六进制]

将输入记录分隔符($ /)指定为八进制或十六进制数字。 如果没有数字,则空字符是分隔符。 其他开关可以在数字之前或之后。 … 00的特殊值将导致Perl在段落模式下流氓文件。 任何值0400或以上将导致Perl整个文件,但按照惯例,值0777是通常用于此目的。