【问题标题】:Replace multiline string by multiline string using perl使用 perl 将多行字符串替换为多行字符串
【发布时间】:2016-02-15 19:53:23
【问题描述】:

我正在尝试使用 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

另一个问题:我可以用正则表达式查找和替换字符串吗?

感谢您的帮助!

【问题讨论】:

  • 如果您已经尝试过,请提供一个示例来证明您正试图了解问题。

标签: regex linux perl multiline


【解决方案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 ;

【讨论】:

  • 当您尝试使用正则表达式解析 XML 或 HTML 时会发生什么的必填链接:stackoverflow.com/questions/1732348/…
  • 虽然我大体上同意,但他实际上并没有要求解析 HTML,即从中获取信息。
  • @Jan:关键是你不能在不解析 XML 文档的情况下可靠地修改它。
【解决方案2】:

你可以想出:

~^(<!--.*\R)(\s+<Connector[^>]+>)(.*\R-->.*)~

并用第二组替换匹配,见a demo here on regex101.com。

【讨论】:

    猜你喜欢
    • 2014-06-20
    • 1970-01-01
    • 2022-01-08
    • 2014-09-30
    • 2020-11-21
    • 2021-10-08
    • 2016-08-02
    • 1970-01-01
    • 2014-05-23
    相关资源
    最近更新 更多