问题描述
我想替换 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'