这是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 。
答案 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是通常用于此目的的那个。