我不明白(基于https://ubuntuforums.org/showthread.php?t=1643334):
% grep -a -b -P --only-matching 'LUKS\xba\xbe' /dev/sde ### does not match
% echo -e 'LUKS\xba\xbe...' | grep -a -b -P --only-matching 'LUKS' ### matches
0:LUKS
% echo -e 'LUKS\xba\xbe...' | grep -z -a -b -P --only-matching 'LUKS' ### matches
0:LUKS
% echo -e 'LUKS\xba\xbe...' | grep -z -a -b -P --only-matching 'LUKS\xba' ### does not match
% echo -e 'LUKS\xba\xbe...' | grep -z -a -b -P --only-matching 'LUKS\xba\xbe' ### does not match
为什么 grep 不匹配(显然它应该匹配),我要怎么做才能让它匹配?
我曾在 Tails 4.18 和 openSUSE Leap 15.2 中尝试过这些命令。
答案1
TL;DR:该grep
命令使用当前语言环境解释其输入。
正如您所见,这并不匹配:
echo -e 'LUKS\xba\xbe...' | grep -z -a -b -P --only-match 'LUKS\xba'
更重要的是,甚至.
应该匹配所有内容的 也不匹配:
echo -e 'LUKS\xba\xbe...' | grep -z -a -b -P --only-match 'LUKS.'
但是,如果我们为该会话设置语言环境...
export LC_ALL=C
然后再试一次,成功了:
echo -e 'LUKS\xba\xbe...' | grep -z -a -b -P --only-match 'LUKS\xba'
您的语言环境取决于您的系统配置方式。输入locale
即可查看所有语言环境信息。在我的系统上,默认语言环境是LC_CTYPE="en_US.UTF-8"
,我认为这意味着grep
期望其输入为 UTF8,而输入LUKS\xba\xbe...
(十六进制4c 55 4b 53 ba be 2e 2e 2e
)不是有效的 UTF8 序列。请参阅LC_ALL, LC_CTYPE, LANG
Grep 手册页,并注意其中说:“句点 . 匹配任何单个字符。 目前还未指定它是否匹配编码错误。“(重点是我的)