如何删除大型 xml 文件(>2GB)中两个标签之间的内容

如何删除大型 xml 文件(>2GB)中两个标签之间的内容

有问题的文件是 XML,但我想要一个 Shell 脚本来删除嵌入的所有二进制 (Base64) 编码图像。这些文件通常很大 (>2GB)。

我想删除以下之间的所有内容:

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

</attribute>

解决方案需要读入文件并写出不包含二进制数据的修改后的文件,从而删除嵌入的图像。我在 Mac OS X 终端上使用 Bash Shell。

我尝试(但没有成功)使用sed

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

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

答案1

请不要使用基于“行”和“正则表达式”的 XML 解析。这真的是一个坏主意 - 有几种完全有效且语义相同的 XML 格式,但它们会匹配不同的正则表达式。

因此,我的答案是 - 使用解析器。我将从perland开始XML::Twig,然后执行如下操作:

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

为了节省内存,XML::Twig允许您purge随心所欲flush地执行操作。这需要由 XML 文档的逻辑“块”之一触发,因此如果没有更多信息,我无法为您提供示例。但是您可以将其作为树枝处理程序执行,并将“迄今为止的数据”写入输出文件。

答案2

你尝试过使用 awk 吗?

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

相关内容