1

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

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

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

<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>

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

4

2 回答 2

7

您想一次读取整个文件并进行替换,而-0777参数正是这样做的。

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

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

于 2013-05-31T16:26:25.507 回答
2

当您使用该选项时,脚本位于循环-p体内。while (<>)所以undef $/;在你进入循环之前不会被执行。所以第一次迭代将处理第一行输入,第二次迭代将处理其余的输入。

您可以使用BEGIN块在循环之前插入代码:

perl -i -pe 'BEGIN {undef $/;} s#(<web-app[^>]*>).*?(</web-app>)#\1CHEESE\n\2#gsi' filePath/web.xml
于 2013-05-31T16:33:16.450 回答