使用perl用多行字符串替换多行字符串

时间:2016-02-15 19:53:24

标签: regex linux perl multiline

我尝试使用perl编辑tomcat配置文件。我想取消注释xml文件中的以下行。我用perl尝试过它,但它不会工作。

<!--
    <Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol"
               maxThreads="150" SSLEnabled="true" scheme="https" secure="true"
               clientAuth="false" sslProtocol="TLS" />
-->

这就是我得到的:

perl -i -pe 's~<!--\n    <Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol"\n              maxThreads="150" SSLEnabled="true" scheme="https" secure="true"\n              clientAuth="false" sslProtocol="TLS" />\n    -->~<Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol"\n              maxThreads="150" SSLEnabled="true" scheme="https" secure="true"\n              clientAuth="false" sslProtocol="TLS" />~' $CATALINA_HOME/conf/server.xml

另一个问题:我能找到并用正则表达式替换字符串吗?

感谢您的帮助!

2 个答案:

答案 0 :(得分:1)

正则表达式不是修改XML的正确工具。 使用XML感知库。例如,XML::LibXML

#! /usr/bin/perl
use warnings;
use strict;

use XML::LibXML;

my $xml     = 'XML::LibXML'->load_xml(location => 'file.xml');
my $comment = $xml->findnodes('//comment()')->[0];
my $inner   = 'XML::LibXML'->load_xml(string => $comment->textContent)
              ->getFirstChild;
$comment->replaceNode($inner);
print $xml;

或更短xsh  包装器:

open file.xml ;
xinsert chunk string(//comment()[1]) replace //comment()[1] ;
save :b ;

答案 1 :(得分:0)

你可以提出:

nnoremap ; A;<esc>hh2f;xx 

将匹配替换为第二组,请参阅a demo here on regex101.com