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