Perl 二进制sed替换
我试图在二进制文件中执行Perl 二进制sed替换,perl,binary,sed,hex,replace,Perl,Binary,Sed,Hex,Replace,我试图在二进制文件中执行sed替换,但我开始相信这是不可能的。基本上,我想做的与以下类似: sed -bi "s/\(\xFF\xD8[[:xdigit:]]\{1,\}\xFF\xD9\)/\1/" file.jpg 我希望实现的逻辑是:扫描二进制文件直到十六进制代码FFD8,继续读取直到FFD9,只保存它们之间的内容(丢弃前后的垃圾,但将FFD8和FFD9作为文件的保存部分) 有什么好办法吗?即使不使用sed 编辑:我只是随便玩玩,在我看来找到了最干净的方法。我知道这个grep语句会显得贪
sed
替换,但我开始相信这是不可能的。基本上,我想做的与以下类似:
sed -bi "s/\(\xFF\xD8[[:xdigit:]]\{1,\}\xFF\xD9\)/\1/" file.jpg
我希望实现的逻辑是:扫描二进制文件直到十六进制代码FFD8
,继续读取直到FFD9
,只保存它们之间的内容(丢弃前后的垃圾,但将FFD8
和FFD9
作为文件的保存部分)
有什么好办法吗?即使不使用sed
编辑:我只是随便玩玩,在我看来找到了最干净的方法。我知道这个grep语句会显得贪婪
hexdump -ve '1/1 "%.2x"' dirty.jpg | grep -o "ffd8.*ffd9" | xxd -r -p > clean.jpg
塞德也许能做到,但这可能很棘手。下面是一个Python脚本,它也做了同样的事情(请注意,它就地编辑文件,这是我假设您希望基于sed脚本执行的操作):
有什么好方法可以做到这一点吗
当然可以,使用图像编辑工具,比如ImageMagick(在网上搜索linux jpeg、exif编辑器等)中的工具,它知道如何编辑jpg元数据。我相信你能找到一个适合你的工具。不要试图用强硬的方式来做这件事。:) 此外,此Perl可能会工作(未经测试,请注意)。。。如果未安装Python:) 您需要添加
binmode(文件);二进制模式(标准输出)调用open()
后在DOS或VMS上执行code>,在Unix上不需要。是“二进制文件的sed”,对于大型二进制文件,应该比转储/重构更有效
其使用示例如下:
$ bbe -e 's/original/replaced/' infile > outfile
关于。旧问题的更多信息,但是
xxd infile | sed 's/xxxx xxxx/yyyy yyyy/' | xxd -r > outfile
可能是最简单、最可靠的解决方案。与OP.agree中的编辑类似,这本质上是随机的二进制数据,因此在搜索任何2字节序列时,都有1/(2**16)的误报。大约每65K data.exiftool()就有一次是媒体元数据的杀手级应用程序。请将我上面的评论复制到这里:仅供参考,这个问题的目的是在RAID 5场景中进行手动文件雕刻。抓取条纹和块时,您将获得jpg(或任何其他文件)前后的数据。这是为了清理它。当在本质上是随机数据(例如压缩的二进制流)中对模式进行grepping时,始终要小心错误匹配@史努比-(1)有更好的解决方案吗?(2) 如果没有,需要做些什么来改善这种情况?一旦到达某个“元数据结束”就停止搜索?具体取决于您正在执行的操作,但CPAN模块Image::EXIF允许您提取和更改元数据。此处可能有用。仅供参考,此问题的目的是在RAID 5场景中进行手动文件雕刻。抓取条纹和块时,您将获得jpg(或任何其他文件)前后的数据。这是为了清理它。对不起,是我。当我试图在二进制数据中搜索短模式时,我自己也被错误所困扰。想想看,这种不匹配很有可能发生在一个或另一个锚点上,或者完全拾取一个随机的“幻影模式”。我只是觉得这部作品迟早会以奇怪的乱码jpeg结尾,不知道为什么!出于同样的原因,也否决了其他人的投票。如果你说OP有XY问题,请在下载regex解决方案之前提供一个比regex更好的解决方案,并将其作为“坏”下载。如果这个答案有错误,请指出。如果有一个特定的模式,其中regexp方法将失败,请澄清,作为一个答案(同样是XY),请注意,此解决方案不会更改jpg文件。仅输出找到的字符串(我猜可能是元数据)到标准输出以供以后重定向/使用请注意,如果我想用/path/sub替换C:\path/sub,短语(\xff\xd8[0-9A-fa-f]+)\xff\xd9
将如何更改?提前感谢您可能的回答。
$ bbe -e 's/original/replaced/' infile > outfile
xxd infile | sed 's/xxxx xxxx/yyyy yyyy/' | xxd -r > outfile