我不明白(基于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 中尝试过这些命令。
TL;DR:该
grep
命令使用当前语言环境解释其输入。如您所示,这不匹配:
更重要的是,即使
.
应该匹配所有内容的 ,也不匹配:但是,如果我们为此会话设置语言环境...
然后再试一次,它的工作原理:
您的语言环境取决于您的系统是如何配置的。键入
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 手册页,并注意它说,“句点 . 匹配任何单个字符。 未指定它是否匹配编码错误。 ”(强调我的)