Я пытался сделать 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
Есть хороший способ сделать это
да, конечно, используйте инструмент для редактирования изображений, например как и ImageMagick (ищите в сети linux jpeg, exif editor и т. д.), который знает, как редактировать метаданные jpg. Я уверен, что вы сможете найти один инструмент, который вам подходит. Не пытайтесь делать это на собственном горьком опыте. :)
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()
Кроме того, этот 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.