como deletar linha do arquivo XML

2

como excluir apenas a linha do arquivo xml (com sed / awk ou perl uma linha de linha)

que começam com:

<units> 

e terminou com

</Networks>

como o seguinte

<units><unit ip= ............   </units><ranges/></Networks>
    
por maihabunash 16.03.2015 / 11:42

3 respostas

3

Tente isto:

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

Observe que, se você tiver espaço à esquerda ou à direita na linha, precisará disso:

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

Eu usei o pipe como um separador em vez de cortar para evitar vazamentos desnecessários.

    
por 16.03.2015 / 12:22
4

Não use expressões regulares para analisar XML. É uma excelente maneira de criar códigos frágeis, porque há um monte de coisas perfeitamente válidas que você pode fazer com XML, que quebrarão um regex. Coisas como reformatar o XML de maneiras inteiramente válidas (como 'imprimir bonito' em um formulário aninhado / indentado) irão quebrar seu código.

Em vez disso, sugiro - use um analisador XML. Pessoalmente, gosto do módulo XML::Twig em perl.

Seu comentário sugere que o que você está tentando fazer é adicionar itens a um elemento <Networks> em seu XML.

Então, que tal algo como isto:

#!/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;
    
por 16.03.2015 / 12:27
0

Como você indica que está ciente de que isso quebrará seu XML, você poderá fazer o que quiser com um destes:

  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 (e zsh), para completar

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