关于windows:如何在Perl RegEx中替换多个任意字符(包括换行符)?

How to replace multiple any-character (including newline) in Perl RegEx?

这是MyTextString.txt的简化描述:

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

START BlaBla-In END BlaBla-Out-Between START BlaBla-In END BlaBla-Out-Between START BlaBla-In END BlaBla-Out-Between START BlaBla-In END ...

我正在寻找删除END和START(BlaBla-Out-Between)之间的文本,结果如下:

START BlaBla-In END newline START BlaBla-In END newline START BlaBla-In END newline START BlaBla-In END ...

我有一个perl文件changes.pl:

1
2
3
4
5
6
BEGIN {
    @ARGV = map glob(""$_""), @ARGV;
}

s/(END).*?(START)/$1
$2/sg; #TEST

我应该使用这个CMD线执行我的替换:

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

注意:changes.pl和CMD行正如本问题中所述与其他RegEx查找和替换字符串一起运行良好。

但是使用此RegEx字符串,MyTextString.txt不会发生任何修改:

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

我认为关于我的正则表达式语法的每一件事都可以,因为它在regex 101测试器上运行良好。

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


在进行替换之前,您需要将整个文件粘贴到字符串中。 -p命令行开关一次只读取一行。

这意味着替换s/(END).*?(START)/$1
$2/sg
将仅删除在同一行上存在END模式后跟START模式的情况下的任何内容。

要粘贴文件,您可以指定八进制0777的输入记录分隔符:

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

来自perlrun:

-0[octal/hexadecimal]

specifies the input record separator ($/ ) as an octal or hexadecimal number. If there are no digits, the null
character is the separator. Other switches may precede or follow the
digits. ... The special value 00 will cause Perl to slurp files in paragraph mode. Any value 0400 or
above will cause Perl to slurp files whole, but by convention the
value 0777 is the one normally used for this purpose.