sed 또는 awk를 사용하여 기존 xml 파일에 새 속성 추가

sed 또는 awk를 사용하여 기존 xml 파일에 새 속성 추가

다음 세부 정보가 포함된 xml 파일이 있습니다.

<server>
  <mbean code="WSMQConnectionFactory" name="service=MQQueueConnectionFactory">
  <attribute name="JndiName">WSMQQueueConnectionFactory</attribute> 
  <attribute name="QueueManagerName">QMPMP</attribute>
  <attribute name="HostName">10.10.20.21</attribute>  
  <attribute name="Channel">CHANNEL01</attribute> 
  <attribute name="TransportType">MQJMS_TP_CLIENT_MQ_TCPIP</attribute> 
  <depends>jboss:service=Naming</depends> 
 </mbean>
</server>

"HostName" 속성을 검색하고 그 뒤에 새 속성(포트)을 추가하고 싶습니다. 다음과 같아야 합니다.

<server>
  <mbean code="WSMQConnectionFactory" name="service=MQQueueConnectionFactory">
    <attribute name="JndiName">WSMQQueueConnectionFactory</attribute> 
    <attribute name="QueueManagerName">QMPMP</attribute>
    <attribute name="HostName">10.10.20.21</attribute> 
    <attribute name="Port">1414</attribute> 
    <attribute name="Channel">CHANNEL01</attribute>
    <attribute name="TransportType">MQJMS_TP_CLIENT_MQ_TCPIP</attribute> 
    <depends>jboss:service=Naming</depends> 
  </mbean>
  </server>

제안해주세요

답변1

제발 이러지 마세요. XML은 정규식에 "적합"하지 않는 구조화된 데이터 유형입니다. XML이 일반 텍스트인 것처럼 가장하고 예를 들어 "sed"를 사용하여 조정할 수 있지만 이는 깨지기 쉬운 코드를 만드는 데 매우 좋은 방법입니다. 다양한 XML 구조가 의미상 동일하기 때문입니다.작동하지 않습니다같은 방법으로.

이를 위해서는 파서가 정말로 필요합니다. 나는 Perl(어디에나 있음)을 사용하는 것을 권장하며 XML::TwigPerl은 매우 일반적이고 설치가 쉽습니다.

이 코드는 트릭을 수행합니다(실제보다 약간 깁니다).필요예, 하지만 명확성을 위한 것입니다.)

#!/usr/bin/env perl

use strict;
use warnings;

use XML::Twig;

sub paste_port {
    my ( $twig, $attribute ) = @_;
    my $port_attr =
        XML::Twig::Elt->new( 'attribute', { 'name' => 'Port' }, 1414 );
    print "Inserting:\n", $port_attr->sprint, "\n";
    $port_attr->paste_after($attribute);
}

my $twig = XML::Twig->new(
    'pretty_print'  => 'indented',
    'twig_handlers' => { 'attribute[@name="HostName"]', \&paste_port }
);
$twig->parsefile('your_xml.xml');
$twig->print;

#save to file 'new_xml.xml'
open( my $output_file, ">", "new_xml.xml" ) or warn $!;
print {$output_file} $twig->sprint;
close($output_file);

그러면 다음과 같은 출력이 생성됩니다.

<server>
  <mbean code="WSMQConnectionFactory" name="service=MQQueueConnectionFactory">
    <attribute name="JndiName">WSMQQueueConnectionFactory</attribute>
    <attribute name="QueueManagerName">QMPMP</attribute>
    <attribute name="HostName">10.10.20.21</attribute>
    <attribute name="Port">1414</attribute>
    <attribute name="Channel">CHANNEL01</attribute>
    <attribute name="TransportType">MQJMS_TP_CLIENT_MQ_TCPIP</attribute>
    <depends>jboss:service=Naming</depends>
  </mbean>
</server>

답변2

다음 방법을 시도해 보세요.

sed -i -r 's/(.*HostName.*)/\1\n<attribute name="Port">1414<\/attribute>/g' filename

다음으로 이어진다:

$ cat filename
<server>
  <mbean code="WSMQConnectionFactory" name="service=MQQueueConnectionFactory">
  <attribute name="JndiName">WSMQQueueConnectionFactory</attribute>
  <attribute name="QueueManagerName">QMPMP</attribute>
  <attribute name="HostName">10.10.20.21</attribute>
<attribute name="Port">1414</attribute>
  <attribute name="Channel">CHANNEL01</attribute>
  <attribute name="TransportType">MQJMS_TP_CLIENT_MQ_TCPIP</attribute>
  <depends>jboss:service=Naming</depends>
 </mbean>
</server>

관련 정보