【问题标题】:awk split on hex stringawk 在十六进制字符串上拆分
【发布时间】:2023-12-14 02:31:02
【问题描述】:

我有一个包含多个 jpeg 的文件。所以我想将它们拆分为单个 jpeg。

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

所以我找到了这个 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 个字节大

【问题讨论】:

  • 0x 是十六进制值的文本表示的开头。但如果你的文件是二进制文件,你就找不到了。
  • JFIF 是否保证在其他任何地方都没有这个序列?
  • 不,我没有,但我可以在搜索序列中添加更多字节,这足以完成我的任务
  • 我认为第一个字节应该是FF D8 FF E0
  • awk 的文档说前面带 \0x 的所有字符串都使用十六进制。

标签: bash awk hex jpeg


【解决方案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);
}

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      最近更新 更多