我不明白(基於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 手冊頁,並注意它說:“句點 . 匹配任何單個字元。 未指定是否匹配編碼錯誤。「(強調我的)