我正在尝试使用 Perl 的一行命令来更新跨越多行的代码,但是遇到了一些奇怪的行为。这里是一个简单的文本文件,展示了我看到的问题:
ABCD START
STOP EFGH
我原本以为以下代码可以起作用,但它实际上没有替换任何东西:
perl -pi -e 's/START\s+STOP/REPLACE/s' input.txt
经过一些实验,我发现原始正则表达式中的\s+
将匹配换行符,但不会匹配第二行上的任何空格,添加第二个\s+
也不起作用。因此,目前我正在使用以下解决方法,即添加一个仅删除换行符的中间正则表达式:
perl -pi -e 's/START\s+/START/s' input.txt
这将创建以下中间文件:
ABCD START STOP EFGH
那么我可以运行原始正则表达式(尽管/s
不再需要):
perl -pi -e 's/START\s+STOP/REPLACE/s' input.txt
这将创建最终所需的文件:
ABCD REPLACE EFGH
看起来中间步骤是不必要的。我有什么遗漏吗?
/s
只影响.
匹配的内容,因此您不需要使用任何/s
。 - ysth