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

时间:2016-04-10 17:46:15

标签: regex windows perl cmd

这是MyTextString.txt的简要说明:

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

  

START BlaBla-In END BlaBla-Out-Between START BlaBla-In END BlaBla-Out-在 START 之间BlaBla-In END BlaBla-Out-Between START BlaBla-In END ...

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

  

开始 BlaBla-In 结束换行开始 BlaBla-In 结束换行 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行

执行我的替换
perl -i.bak -p changes.pl My/File/Directory/MyTextString.txt

注意: changes.pl CMD行运行良好,如此question中所述,其他RegEx查找和替换字符串。

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

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

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

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

1 个答案:

答案 0 :(得分:2)

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

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

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

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

来自perlrun

  

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

     

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