`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...(hex 4c 55 4b 53 ba be 2e 2e 2e) 不是有效的 UTF8 序列。請LC_ALL, LC_CTYPE, LANG參閱 Grep 手冊頁,並注意它說:“句點 . 匹配任何單個字元。 未指定是否匹配編碼錯誤。「(強調我的)

相關內容