use*_*359 2 regex perl command-line
您好,我是 Perl 的新手,我想知道如何使用它来替换多行模式下的正则表达式。如果可能的话,也制作“。” 与断线相匹配。
我正在使用以下表达式:
perl -pe 's/text.*end/textChanged/g' myFile.txt
Run Code Online (Sandbox Code Playgroud)
上面的表达式替换为单行模式。它不考虑断线。
使用: Windows Stranberry Perl
请注意,Perl 单行语句使用 -p 或 -n 开关,在幕后包装 while 循环。while 循环使用逐行读取的标量上下文,因此除非出现text.*end在单行中,否则您不会在输出中看到任何更改。
这是一个示例
$ cat a.txt
abc
text 1 2
2 3 4
ab end
hello
here
$ perl -pe 's/text.*end/textChanged/g' a.txt # Nothing happens - while reads line by line
abc
text 1 2
2 3 4
ab end
hello
here
Run Code Online (Sandbox Code Playgroud)
现在,您可以将记录分隔符变量设置为undef。
$ perl -pe ' BEGIN { $/=undef } s/text.*end/textChanged/g' a.txt # Nothing happens
abc
text 1 2
2 3 4
ab end
hello
here
Run Code Online (Sandbox Code Playgroud)
但是,当您添加 /s 修饰符时,就会发生替换。
$ perl -pe ' BEGIN { $/=undef } s/text.*end/textChanged/gs ' a.txt
abc
textChanged
hello
here
$
Run Code Online (Sandbox Code Playgroud)
使用 slurp 模式读取整个文件,您的替换再次没有任何反应。
$ perl -0777 -pe ' s/text.*end/textChanged/g ' a.txt
abc
text 1 2
2 3 4
ab end
hello
here
$
Run Code Online (Sandbox Code Playgroud)
现在您使用 /s 标志,以便点也可以匹配换行符并进行替换。
$ perl -0777 -pe ' s/text.*end/textChanged/gs ' a.txt
abc
textChanged
hello
here
$
Run Code Online (Sandbox Code Playgroud)
感谢@ikegami...提供捆绑选项,如下所示
$ perl -0777pe ' s/text.*end/textChanged/gs ' a.txt
Run Code Online (Sandbox Code Playgroud)
因此,当您希望点匹配换行符时,您需要在正则表达式中添加 /s 修饰符。