我正在尝试解析以下多行字符串(以 开头)并将其注释掉。
-->
<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 -->/;
呵呵