как удалить строку из файла XML

как удалить только строку из xml-файла (с помощью sed / awk или perl one liner line)

которые начинаются с:

<units> 

и закончился

 </Networks> 

как последующее

 <units><unit ip= ............ </units><ranges/></Networks> 

Попробуй это:

 perl -i -pe 's|^<units>.*</Networks>$||' /my/filename 

Обратите внимание: если у вас есть ведущее или конечное пространство в строке, вам это нужно:

 perl -i -pe 's|^ *<units>.*</Networks> *$||' /my/filename 

I uesd pipe как разделитель, а не слэш, чтобы избежать ненужного выхода.

Не используйте регулярные выражения для синтаксического анализа XML. Это отличный способ создать хрупкий код, потому что есть множество абсолютно правильных вещей, которые вы можете сделать с XML, который сломает регулярное выражение. Такие вещи, как переформатирование XML в полностью допустимых способах (например, «довольно печатать» его в вложенной / отступом), нарушит ваш код.

Вместо этого я бы предложил – использовать синтаксический анализатор XML. Лично мне нравится модуль XML::Twig в perl.

Ваш комментарий предполагает, что вы пытаетесь добавить материал в элемент <Networks> в вашем XML.

Итак, как насчет чего-то вроде этого:

 #!/usr/bin/perl use strict; use warnings; use XML::Twig; my $xml_text = '<XML> <Networks><units><unit ip="1.2.3.4" /></units><ranges/></Networks> </XML>'; my $parser = XML::Twig->new( 'pretty_print' => 'indented' ); #would probably use 'parsefile' instead here $parser->parse($xml_text); print "\nBefore:\n"; $parser->print; #insert a new element into 'Networks': $parser->root->first_child('Networks')->insert_new_elt( 'last_child', #position - end of "Networks" element 'new_element', #element { 'attribute_here' => "value_here", 'another_attribute' => 'another_value', }, #attributes as key value pairs "Content_here", #element content ); print "\nAfter:\n"; $parser->print; 

Поскольку вы указываете, что знаете, что это нарушит ваш XML, вы можете сделать то, что хотите, одним из них:

  1. Perl

     perl -ne 'print unless m#^<units>.*</Networks>$#' file.xml perl -ne 'm#^<units>.*</Networks>$# ? next : print' file.xml 
  2. AWK

     awk '!/^<units>.*<\/Networks>$/' file.xml 
  3. СЕПГ

     sed '/^<units>.*<\/Networks>$/d' file.xml 
  4. Grep

     grep -Ev '^<units>.*<\/Networks>$' file.xml 
  5. Bash (и zsh), ради завершения

     while read -r line; do [[ "$line" =~ ^\<units\>.*\<\/Networks\>$ ]] || printf "%s\n" "$line" done < file.xml