Como posso deletar o conteúdo entre duas tags em um arquivo xml grande (2GB)

0

O arquivo em questão é XML, mas eu quero que um Script Shell remova todas as imagens codificadas binárias (Base64) que estão incorporadas. Os arquivos geralmente são enormes (> 2 GB).

Eu quero excluir tudo entre:

<attribute name="picture" type="binary"> 

e

</attribute>

A solução precisa ler o arquivo e gravar um arquivo modificado sem os dados binários, removendo assim as imagens incorporadas. Estou usando um Bash Shell no terminal do Mac OS X.

Eu tentei (sem sucesso) usar sed :

sed '|<attribute name="picture" type="binary">|,|</attribute>|{||!d}' Original.file

sed 'type="binary">','</attribute>'{//!d}' Original.file > New.file
    
por carp3tshark 30.03.2015 / 23:10

2 respostas

0

Por favor, nunca use a análise de linha com base em 'linha' e 'expressão regular' de XML. É uma ideia muito ruim - existem várias variedades de formatação XML que são perfeitamente válidas e semanticamente idênticas, mas que corresponderão a diferentes expressões regulares.

Então minha resposta seria - use um analisador. Gostaria de começar com perl e XML::Twig e fazer algo assim:

#!/usr/bin/perl

use strict;
use warnings;

use XML::Twig;

my $twig = XML::Twig->new(
    'twig_handlers' => {
        'attribute[@type="binary" and @name="picture"]' => sub { $_->delete }
    }
);

$twig ->parsefile ( 'your_file' );
$twig -> print;|

Para economizar memória, XML::Twig permite que você use purge e flush . Isso precisaria ser acionado em um dos 'blocos' lógicos do seu documento XML, portanto, não posso dar um exemplo sem mais informações. No entanto, você faria isso como um manipulador de gravetos, além de gravar os 'dados até o momento' em seu arquivo de saída.

    
por 31.05.2015 / 23:25
-1

Você já tentou usar o awk?

awk '/<attribute name="picture" type="binary">+$/,/<\/attribute>+$/{next}1' original.txt > new.txt
    
por 04.04.2015 / 03:37