Добавление нового атрибута к существующему XML-файлу с помощью sed или awk

В дополнение к отличному ответу jasonwryans: у большинства помощников AUR есть флаг для обновления пакетов разработки, даже если их pkgver не изменился в AUR. Для pacaur этот флаг называется - devel , который может использоваться вместе с его операциями обновления. Это заставит pacaur пересобрать пакет разработки, но только если их исходный код новее, чем у уже установленного пакета. Использование опции - rebuild также заставит pacaur перестроить пакеты разработки, даже если ваш текущий пакет обновлен.

1
04.03.2015, 22:54
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>
0
27.01.2020, 23:51

Пожалуйста, не делайте этого. XML является структурированным типом данных, и это тот, который не подходит для регулярного выражения. В то время как вы можете притворяться, что ваш XML - это простой текст, и использовать E.G. «SED», чтобы отрегулировать его, это очень хороший способ создания хрупкого кода - поскольку разные структуры XML, которые семантически идентичны , не будут работать таким же образом.

Чтобы сделать это, вам действительно нужен парсер. Я бы предложил Perl (который повсеместно) и XML :: Twig , который довольно распространен и легко устанавливается.

Этот код сделает это (это немного дольше, чем на самом деле , но это в интересах ясности).

#!/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>
1
27.01.2020, 23:51

Теги

Похожие вопросы