有问题的文件是 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 格式,但它们会匹配不同的正则表达式。
因此,我的答案是 - 使用解析器。我将从perl
and开始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