2012-07-02 5 views
0

У меня есть файл с несколькими jpeg внутри. Поэтому я хотел бы разделить их на отдельные jpeg.awk split on hex string

Простая часть состоит в том, чтобы найти начало: 0xFF0xD8 0xFF0xE1 обозначает начало поля JPG и EXIF ​​Data, которое в моем случае всегда в начале.

Так что я нашел эту команду AWK:

awk '/string/{n++}{print >"out" n ".txt" }' final.txt

Чтобы разделить файлы. Что не работает должным образом, когда я использую его с шестигранной:

awk '/0xFF0xD8 0xFF0xE1/{n++}{print >"out" n ".txt" }' final.txt

Док из AWK говорит, что все строки с 0x перед используются как гекса, но я, кажется, не работает хорошо ..

Редактировать: хорошо я нашел это: https://superuser.com/questions/174362/how-to-split-binary-file-based-on-pattern, но он не работает для меня ... он должен создать 2 файла, но только один из них создан и его только 11 байтов большой

+2

'0x' является начало текстового представления шестнадцатеричного значения. Но если ваш файл двоичный, вы его не найдете. – mouviciel

+0

Сохраняет ли JFIF эту последовательность в другом месте? –

+0

no i does not, но я мог бы добавить несколько байтов в последовательность поиска, и это было бы достаточно для моей задачи. – reox

ответ

1

Вы уверены, что awk отлично справляется с бинарными файлами? Я думал, что он будет ожидать новых строк.

Perl можно использовать шестигранные сбегает в регулярных выражениях (Основная идея от this answer):

#!/usr/bin/perl 
undef $/; 
$_ = <>; 
$n = 0; 
for $content (split(/(?=\xFF\xD8\xFF\xE0)/)) { 
     open(OUT, ">out" . ++$n . ".txt"); 
     print OUT $content; 
     close(OUT); 
} 
+0

yep, который работает! благодаря! – reox

0

Perl если возможно предпочтительный инструмент, но AWK может справиться с этим просто отлично:

awk '{print > "out" NR ".jpg"}' RS=$(printf '\xff\xd8\xff\xe0')