awk拆分十六进制字符串

时间:2012-07-02 12:10:18

标签: bash awk hex jpeg

我的文件里面有多个jpegs。所以我想将它们分成单个jpeg。

简单的部分是找到开头:0xFF0xD8 0xFF0xE1标记JPG和EXIF数据字段的开头,这在我的情况下总是在开头。

所以我找到了这个awk命令:

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

拆分文件。当我将它与hex一起使用时,这不能正常工作:

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 个答案:

答案 0 :(得分: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);
}

答案 1 :(得分:0)

perl如果可能是首选工具,但是awk可以很好地处理它:

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