Заменить многострочную строку на многострочную строку с помощью Perl

Я пытаюсь отредактировать файл конфигурации tomcat с помощью perl. Я хочу раскомментировать следующие строки в 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

Другой вопрос: могу ли я найти и заменить строку регулярным выражением?

Спасибо за любую помощь!


person Jakob Benz    schedule 15.02.2016    source источник
comment
Продемонстрируйте, что вы пытаетесь понять проблему, предоставив пример того, что вы уже пробовали.   -  person Terry Burton    schedule 15.02.2016


Ответы (2)


Регулярное выражение - неподходящий инструмент для изменения 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 ;
person choroba    schedule 15.02.2016
comment
Обязательная ссылка на то, что происходит, когда вы пытаетесь использовать регулярное выражение для синтаксического анализа XML или HTML: stackoverflow.com/questions/1732348/ - person mscha; 16.02.2016
comment
Хотя я в целом согласен, он на самом деле не просил разбирать HTML, то есть получать из него информацию. - person Jan; 16.02.2016
comment
@Jan: Дело в том, что вы не можете надежно изменить XML-документ, не проанализировав его. - person choroba; 16.02.2016

Вы могли бы придумать:

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

И замените совпадение второй группой, см. демонстрацию здесь, на regex101.com.

person Jan    schedule 15.02.2016