двоичная замена седана - PullRequest
       12

двоичная замена седана

11 голосов
/ 09 апреля 2010

Я пытался сделать замену sed в двоичном файле, но я начинаю верить, что это невозможно. По сути, то, что я хотел сделать, было похоже на следующее:

sed -bi "s/\(\xFF\xD8[[:xdigit:]]\{1,\}\xFF\xD9\)/\1/" file.jpg

Логика, которую я хочу достичь: сканировать двоичный файл до шестнадцатеричного кода FFD8, продолжать чтение до FFD9 и сохранять только то, что было между ними (отбрасывать мусор до и после, но включать FFD8 и FFD9 как сохраненная часть файла)

Есть ли хороший способ сделать это? Даже если не использовать sed?

РЕДАКТИРОВАТЬ: Я просто играл и нашел самый чистый способ сделать это IMO. Я знаю, что это выражение grep будет действовать жадно.

hexdump -ve '1/1 "%.2x"' dirty.jpg | grep -o "ffd8.*ffd9" | xxd -r -p > clean.jpg

Ответы [ 4 ]

10 голосов
/ 15 февраля 2011

bbe - это «sed для двоичных файлов», и он должен работать более эффективно для больших двоичных файлов, чем шифрование / реконструкция.

Пример его использования:

$ bbe -e 's/original/replaced/' infile > outfile

Дополнительная информация на справочной странице .

3 голосов
/ 09 апреля 2010

Is there a good way to do this

да, конечно, используйте инструмент для редактирования изображений, такой как ImageMagick (ищите в сети linux jpeg, exif editor и т. Д.), Который знает, как редактировать метаданные jpg. Я уверен, что вы можете найти один инструмент, который подходит вам. Не пытайтесь сделать это трудным путем. :)

1 голос
/ 09 апреля 2010

Кроме того, этот Perl может работать (не проверено, caveat emptor ) ..., если Python не установлен:)

open(FILE, "file.jpg") || die "no open $!\n";
while (read(FILE, $buff, 8 * 2**10)) {
    $content .= $buff;
}
@matches = ($content =~ /(\xFF\xD8[:xdigit:]+?\xFF\xD9)/g;
print STDOUT join("", @matches);

Вам необходимо добавить binmode(FILE); binmode(STDOUT); в DOS или VMS после вызова open() - не требуется в Unix.

1 голос
/ 09 апреля 2010

sed мог бы это сделать, но это может быть сложно. Вот скрипт Python, который делает то же самое (обратите внимание, что он редактирует файл на месте, что, как я полагаю, вы хотите сделать на основе вашего сценария sed):

import re

f = open('file.jpeg', 'rb+')
data = f.read()
match = re.search('(\xff\xd8[0-9A-fa-f]+)\xff\xd9', data)
if match:
    result = match.group(1)
    f.seek(0)
    f.write(result)
    f.truncate()
else:
    print 'No match'
f.close()
...