【发布时间】:2011-02-05 23:48:44
【问题描述】:
我试图在二进制文件中进行sed 替换,但是我开始相信这是不可能的。基本上我想做的类似于以下内容:
sed -bi "s/\(\xFF\xD8[[:xdigit:]]\{1,\}\xFF\xD9\)/\1/" file.jpg
我希望实现的逻辑是:通过二进制文件扫描直到十六进制代码FFD8,继续阅读直到FFD9,并且只保存它们之间的内容(丢弃前后的垃圾,但包括@987654325 @和FFD9作为文件的保存部分)
有什么好办法吗?即使不使用sed?
编辑:我只是在玩,找到了最干净的方式来做 IMO。我知道这个 grep 语句会表现得很贪婪。
hexdump -ve '1/1 "%.2x"' dirty.jpg | grep -o "ffd8.*ffd9" | xxd -r -p > clean.jpg
【问题讨论】:
-
在对本质上是随机数据(例如压缩二进制流)的模式进行 grepping 时,请务必注意错误匹配!
-
@snoopy - (1) 有更好的解决方案吗? (2) 如果没有,需要做些什么来改善这种情况?一旦到达“元数据末尾”就停止搜索?
-
完全取决于您在做什么,但 CPAN 模块 Image::EXIF 允许您提取和更改元数据。可能在这里有用。
-
仅供参考,这个问题的目的是在 RAID 5 场景中进行手动文件雕刻。抓取条纹和块时,您将在 jpg(或任何其他文件)之前和之后获取数据。这是为了清洁它。
标签: perl binary sed hex replace