这是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.pl和CMD行也正常运行。
但是,对于这个RegExstring,MyTextString.txt不会发生任何修改:
s/(END).*?(START)/$1\n$2/sg;
我认为关于我的正则expression式语法的每一件事情都可以,因为它在正则expression式101testing中运行良好。
我正在寻找使用提到的changes.pl和CMD行匹配和replace任何字符(包括换行符) 。 简单地说,我正在用换行符replaceBlaBla-Out-Between 。
在进行替换之前,您需要把整个文件写入一个字符串。 -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是通常用于此目的。