Файл, о котором идет речь, - это XML, но я хочу, чтобы сценарий оболочки удалял все внедренные двоичные (Base64) кодированные изображения. Файлы, как правило, огромные (> 2 ГБ).

Я хочу удалить все между:

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

а также

</attribute>

Решение должно прочитать файл и записать измененный файл без двоичных данных, таким образом удаляя встроенные изображения. Я использую Bash Shell на Mac OS X терминал.

Я попытался (безуспешно) использовать sed:

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

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

2 ответа2

0

Пожалуйста, никогда не используйте синтаксический анализ XML на основе строк и регулярных выражений. Это действительно плохая идея - есть несколько разновидностей XML-форматирования, которые полностью допустимы и семантически идентичны, но которые будут соответствовать различным регулярным выражениям.

Так что мой ответ будет - использовать парсер. Я хотел бы начать с perl и 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-документа, поэтому я не могу привести вам пример без дополнительной информации. Но вы бы сделали это как обработчик веток, а также записали «данные до сих пор» в ваш выходной файл.

-1

Вы пытались использовать awk?

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .