为什么这个perl正则表达式没有正确执行DOTALL?

Bob*_*Gee 1 regex perl

我正在从命令行使用perl regex操作来修改文件(在linux中),并想知道为什么它无法修改文件.这是正则表达式:

perl -i -pe 'undef $/; s#(<web-app[^>]*>).*?(</web-app>)#\1CHEESE\n\2#gsi' filePath/web.xml
Run Code Online (Sandbox Code Playgroud)

现在,这应该正确匹配多行块.但事实并非如此.样本输入:

<web-app xmlns= "http://java.sun.com/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
         version="2.5">
<stuff goes here and tags and things>
</web-app>
Run Code Online (Sandbox Code Playgroud)

然而,没有任何改变.Dotall应该是匹配的,这适用于在线正则表达式测试工具,但是在Perl中失败了.我究竟做错了什么?

Сух*_*й27 7

您想要立即读取整个文件并进行替换,-0777参数就是这样做的.

perl -i -0777 -pe 's#(<web-app[^>]*>).*?(</web-app>)#\1CHEESE\n\2#gsi' filePath/web.xml
Run Code Online (Sandbox Code Playgroud)

之前$/是在第一行已经读取时设置的,因此正则表达式在部分内容上无法匹配.