微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

无论内容如何,​​如何用 PERL 替换两个序列之间的某些二进制文件?

如何解决无论内容如何,​​如何用 PERL 替换两个序列之间的某些二进制文件?

我想替换 bin 文件中的某个事件。例如

file.bin 内容

0A0A0A0A954654370B0B0B0B
0A0A0A0A453426540B0B0B0B

我想修改 0A0A0A0A 和 0B0B0B0B 之间的内容而不关心原始内容并替换为 每行 0A0A0A0A12345678B0B0B0B

我使用 perl 正则表达式命令:perl -pi -e 's|\x0A\x0A\x0A\x0A\x95\x46\x54\x37\x0B\x0B\x0B\x0B|\x0A\x0A\x0A\x0A\x12\x34\x56\x78\xB0\xB0\xB\x0B|g' /file.bin

但是如何告诉 perl 忽略源代码部分中 0A 和 0B 之间的内容以对文件的所有内容使用一个命令?

解决方法

首先,请注意您使用的是 \xB0\xB0\xB\x0B 而不是 \x0B\x0B\x0B\x0B


接下来,我们必须解决所采用方法的问题。

既然您说它是一个二进制文件,并且您使用的是 \x0A,我假设 0A 表示具有该十六进制值的单个字节。

如果是这样,则 0A 被认为是 Perl 的换行符。替换依次应用于其中的每一个:

0A
0A
0A
0A
954654370B0B0B0B0A
0A
0A
0A
453426540B0B0B0B

您的模式永远不会匹配,因此不会发生替换。

这可以通过使用 -0777 一次读取整个文件来解决。

perl -i -0777pe's{\x0A\x0A\x0A\x0A\x95\x46\x54\x37\x0B\x0B\x0B\x0B}
                 {\x0A\x0A\x0A\x0A\x12\x34\x56\x78\x0B\x0B\x0B\x0B}g'

最后,谈谈你提出的问题。

. 匹配除 0A 之外的任何字符。但是 ./s 匹配任何字符、句点。因此,您可以使用 ....(与 /s)或 .{4}(与 /s)。

perl -i -0777pe's{\x0A\x0A\x0A\x0A.{4}\x0B\x0B\x0B\x0B}
                 {\x0A\x0A\x0A\x0A\x12\x34\x56\x78\x0B\x0B\x0B\x0B}sg'

perl -i -0777pe's/\x0A\x0A\x0A\x0A\K.{4}(?=\x0B\x0B\x0B\x0B)/\x12\x34\x56\x78/sg'

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。