Intereting Posts
Как преобразовать отметки времени в столбце в дату? Могу ли я создать фальшивый eth0, сопоставленный с существующим интерфейсом? Изменение виртуального сетевого интерфейса моментального снимка Ошибка при использовании rsync и scp Резервное копирование магазина при отображении / отмене отображения windows X11? Спецификация Solaris ps aux comand. Почему для grep необходимо использовать параметр ww? Плохо ли иметь тысячи правил autofs? В чем разница между списком ls> list и ls >>? Создание tar-архивов при сжатии? Звук в Linux – драйвер ALSA предотвращает воспроизведение музыки более чем в 1 программе Насколько безопасно удаление данных с помощью rm, за которым следует zerofree в разделе? Что делать mkfs.xfs и modprobe при установке экземпляра Amazon EBS? Переименование файла на более короткое имя, легко используя что-то вроде расширения фигурных скобок проблема возникает при установке скриптов moses Требуется драйвер Realtek ALC221VB

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

У меня есть 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> 

Пожалуйста, предложите

Пожалуйста, не делайте этого. XML – это структурированный тип данных, и он не подходит для регулярного выражения. Хотя вы можете притворяться, что ваш XML – это простой текст и использовать, например, «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> 

Попробуйте так:

 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>