двоичный файл sed замена

Я пытался сделать a 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
13
задан Ryan 13 April 2010 в 13:59
поделиться

3 ответа

Есть хороший способ сделать это

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

3
ответ дан 2 December 2019 в 00:03
поделиться

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()
1
ответ дан 2 December 2019 в 00:03
поделиться

Кроме того, этот 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 (ФАЙЛ); binmode (STDOUT); в DOS или VMS после вызова open () - не требуется в Unix.

1
ответ дан 2 December 2019 в 00:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: