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:
Perl
perl -ne 'print unless m#^<units>.*</Networks>$#' file.xml perl -ne 'm#^<units>.*</Networks>$# ? next : print' file.xml
awk
awk '!/^<units>.*<\/Networks>$/' file.xml
sed
sed '/^<units>.*<\/Networks>$/d' file.xml
grep
grep -Ev '^<units>.*<\/Networks>$' file.xml
Bash (y zsh), por el bien de completar
while read -r line; do [[ "$line" =~ ^\<units\>.*\<\/Networks\>$ ]] || printf "%s\n" "$line" done < file.xml