perl 中的多行替换与扩展表达式不起作用



我正在尝试解析以下多行字符串(以 开头)并将其注释掉。

-->
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
<!-- A "Connector" using the shared thread pool-->

所以我尝试使用以下方法:

perl -i.bak -pe 'BEGIN{undef $/;}
s/
s+ #space at beginning of line
(<Connectors+ #connector
port="8080"s+  #port
protocol="HTTP/1.1" #protocol
n  #newline
s+connectionTimeout="20000"n # space, connection timeout, then newline
s+redirectPort="8443" #redirect port
/> # end of connector entry in file
) # end capture for $1
/
<!--$1-->
/msx
' server.xml
diff server.xml server.xml.bak

但是差异输出什么也没显示。 知道我在这里错过了什么吗?

我想我想通了。

perl -i.bak -pe 'BEGIN{undef $/;}
s/
--> #preceding line ends a comment, with newline at end
s+ #space at beginning of line
(<Connectors+ #connector
port="8080"s+  #port
protocol="HTTP/1.1" #protocol
s+connectionTimeout="20000" # space, connection timeout, then newline
s+redirectPort="8443" #redirect port
s+   #space
/> # end of connector entry in file
) # end capture for $1
/
-->n<!-- $1 -->
/msx
' server.xml
diff server.xml server.xml.bak
~

不要使用该 BEGIN 块。 在文本文件中啜饮的正常方法是使用-0开关。 这会将输入记录分隔符设置为空字符。 如果文件中有可能有空值,请使用-0777

如果您确切地知道搜索文本是什么,那么您就不需要像您编写的那样复杂的东西。 Perl 涵盖了这个用例。Q E运算符会自动引用任何可能麻烦的字符,但仍允许进行变量替换.
$foo = 'f.oo bar$'; print qr/Q$fooE/;
(?^:f.oo bar$)

$pattern = qr{Q<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />E};
$text =~ s/($pattern)/<!-- $1 -->/;

我看到您想将其作为命令行执行,因此它将是这样的。

perl -i.bak -lp0e '$pattern = qr{Q<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />E};
s/($pattern)/<!-- $1 -->/; ' FILE

您输入的代码只会执行一次,因为输入只有"一行"。

如果空白量有回旋余地,则可以对模式本身进行动态替换。

$pattern = qq{Q<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />E};
# Translate runs of escaped whitspace into a single s+
$pattern =~ s/(?:\s)+/s+/g;
$text =~ s/($pattern)/<!-- $1 -->/;

呵呵

最新更新