Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 为什么这个perl正则表达式不能正确执行DOTALL?_Regex_Perl - Fatal编程技术网

Regex 为什么这个perl正则表达式不能正确执行DOTALL?

Regex 为什么这个perl正则表达式不能正确执行DOTALL?,regex,perl,Regex,Perl,我正在使用命令行中的perl regex操作来修改文件(在linux中),我想知道为什么它无法修改文件。以下是正则表达式: perl -i -pe 'undef $/; s#(<web-app[^>]*>).*?(</web-app>)#\1CHEESE\n\2#gsi' filePath/web.xml perl-i-pe'unde$/;s#(]*>).?()#\1CHEESE\n\2#gsi的文件路径/web.xml 现在,这应该正确匹配多行块。但事实并非如

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

perl -i -pe 'undef $/; s#(<web-app[^>]*>).*?(</web-app>)#\1CHEESE\n\2#gsi' filePath/web.xml
perl-i-pe'unde$/;s#(]*>).?()#\1CHEESE\n\2#gsi的文件路径/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中失败。我做错了什么?

您希望立即读取整个文件并进行替换,而
-0777
参数正是这样做的

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

以前,
$/
是在读取第一行时设置的,因此regex无法匹配部分内容。

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

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

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

使用
-p
选项时,脚本位于
while()
循环的主体内。所以
undf$/在进入循环后才会执行。因此,第一次迭代将处理第一行输入,第二次迭代将处理其余的输入

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

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

使用
-p
选项时,脚本位于
while()
循环的主体内。所以
undf$/在进入循环后才会执行。因此,第一次迭代将处理第一行输入,第二次迭代将处理其余的输入

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

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

不要用正则表达式解析XML的多行块。使用XML配对模块。Len Jaffe:如果我只做XML,我会同意的。但是,您没有完整的上下文:这是一个大型项目的一部分,该项目操作各种不同的文件类型,并根据需要使用shellscript和perl。不要使用正则表达式解析XML的多行块。使用XML配对模块。Len Jaffe:如果我只做XML,我会同意的。但是,您没有完整的上下文:这是一个较大项目的一部分,该项目在各种不同的文件类型上运行,并根据需要使用shellscript和perl。
-0
$/
(ifs)设置为零。如果要确保完整的文件,请使用0400以上的数字(按照惯例,通常使用
-0777
-0
将其设置为
$/=“\000”哪个可以被认为对文本文件是安全的?是的,可以被认为对文本文件是安全的,但您声明:您希望一次读取整个文件并进行替换,-0参数正是这样做的。-这是不完全正确的。。。是吗?:);)回答得好,这就解决了问题。接受,因为它比开头的字体更优雅。+1,但当第一行已经是红色时,您有一个深红色的打字错误
:)
-0
$/
(ifs)设置为零。如果要确保完整的文件,请使用0400以上的数字(按照惯例,通常使用
-0777
-0
将其设置为
$/=“\000”哪个可以被认为对文本文件是安全的?是的,可以被认为对文本文件是安全的,但您声明:您希望一次读取整个文件并进行替换,-0参数正是这样做的。-这是不完全正确的。。。是吗?:);)回答得好,这就解决了问题。接受,因为它比开头的更优雅。+1,但当第一行已经是红色时,您有一个深红色的打字错误
:)