使用grep匹配零字节时出现问题



我试图在文件中找到7zip版本3的文件头。根据文件,它们应该是这样的:

00: 6 bytes: 37 7A BC AF 27 1C        - Signature 
06: 2 bytes: 00 04                    - Format version

所以我构建了这个grep命令,它应该与它们匹配:

grep --only-matching --byte-offset --binary --text $'7zxBCxAFx27x1Cx00x03'

然而,它也匹配以0000:结尾的字符串

% xxd -p -r <<< "aaaa 377a bcaf 271c 0000 bbbb 00 377a bcaf 271c 0003" | grep --only-matching --byte-offset --binary --text $'7zxBCxAFx27x1Cx00x03'
2:7z'
13:7z'

我期望的输出只是13:7z'

不能将零字节作为参数的一部分传递。因为一个字符串在C中以零字节结尾,所以grep在运行strlen(argv[...])时不会"参见";零字节之后的任何内容。

如果regex中没有换行符,则可以使用--file=

xxd -p -r <<< "aaaa 377a bcaf 271c 0000 bbbb 00 377a bcaf 271c 0003" |
LC_ALL=C grep --only-matching --byte-offset --binary --text -f <(
echo -n 7z;
echo BCAF271C0003 | xxd -r -p
)

参见https://www.gnu.org/software/grep/manual/grep.html#Matching-非_002dASCII

或者使用PERL regex

xxd -p -r <<< "aaaa 377a bcaf 271c 0000 bbbb 00 377a bcaf 271c 0003" | 
LC_ALL=C grep --only-matching --byte-offset --binary --text -P '7zxBCxAFx27x1Cx00x03'

处理二进制文件时,请记住使用区域设置LC_ALL=C禁用UTF-8序列处理。

注意:<<<""$'string'在任何shell中都不可用,它们在bash中都可用。

最新更新