使用 grep 匹配零字节的问题
Issues matching zero-byte using 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'
处理二进制文件时,请记住使用语言环境设置禁用 UTF-8 序列处理 LC_ALL=C
。
注意:<<<""
和 $'string'
在任何 shell 中都不可用 - 它们在 bash.
中可用
我正在尝试在文件中查找 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'
处理二进制文件时,请记住使用语言环境设置禁用 UTF-8 序列处理 LC_ALL=C
。
注意:<<<""
和 $'string'
在任何 shell 中都不可用 - 它们在 bash.