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

使用 grep 匹配零字节的问题

如何解决使用 grep 匹配零字节的问题

我正在尝试在文件中查找 7zip 版本 3 文件头。根据 documentation,它们应该如下所示:

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 $'7z\xBC\xAF\x27\x1C\x00\x03'

但它也匹配以 0000 结尾的字符串:

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

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

解决方法

不可能将零字节作为参数的一部分传递。因为字符串在 C 中以零字节结尾,所以 grep 运行时 strlen(argv[...]) 不会在零字节之后“看到”任何东西。

如果正则表达式中没有换行符,您可以使用 --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-Non_002dASCII

或者使用 PERL 正则表达式

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 '7z\xBC\xAF\x27\x1C\x00\x03'

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

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

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