cómo eliminar una línea del file XML

cómo eliminar solo la línea del file xml (con líneas sed / awk o perl one)

que comienza con:

<units> 

y terminó con

 </Networks> 

como el follwoing

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

Prueba esto:

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

Tenga en count que si tiene espacio inicial o final en la línea, necesitará esto en su lugar:

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

Puse la tubería como separador en lugar de cortar para evitar escapes innecesarios.

No use expresiones regulares para analizar XML. Es una forma excelente de crear códigos frágiles, porque hay un montón de cosas perfectamente válidas que puedes hacer con XML que romperá una expresión regular. Cosas como reformatear el XML en forms completamente válidas (como "imprimirlo bastante" en forma anidada / indentada) romperán tu código.

En cambio, sugeriría: use un analizador XML. Personalmente, me gusta el module XML::Twig en Perl.

Su comentario sugiere que lo que está tratando de hacer es agregar cosas a un elemento de <Networks> en su XML.

Entonces, ¿qué tal algo así?

 #!/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; 

Como indica que sabe que esto va a romper su XML, puede hacer lo que quiera con uno de estos:

  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

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

     grep -Ev '^<units>.*<\/Networks>$' file.xml 
  5. Bash (y zsh), por el bien de completar

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