`grep -z -a -b -P --only-matching 'LUKS\xba\xbe'` 与 `LUKS\xba\xbe...` 不匹配

`grep -z -a -b -P --only-matching 'LUKS\xba\xbe'` 与 `LUKS\xba\xbe...` 不匹配

我不明白(基于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, LANGGrep 手册页,并注意其中说:“句点 . 匹配任何单个字符。 目前还未指定它是否匹配编码错误。“(重点是我的)

相关内容