Eu não entendo (com base em 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
Por que o grep não corresponde (como obviamente deveria) e o que tenho que fazer para que corresponda?
Eu tentei esses comandos no Tails 4.18 e no openSUSE Leap 15.2.
TL;DR: O
grep
comando interpreta sua entrada usando a localidade atual.Como você mostrou, isso não corresponde:
Além do mais, mesmo o
.
, que deveria corresponder a tudo, não corresponde:No entanto, se definirmos a localidade para esta sessão ...
E tente novamente, funciona:
Sua localidade depende de como seu sistema está configurado. Digite
locale
para ver todas as informações de localidade. No meu sistema, a localidade padrão éLC_CTYPE="en_US.UTF-8"
, o que acredito significa quegrep
está esperando que sua entrada seja UTF8 e a entradaLUKS\xba\xbe...
(hex4c 55 4b 53 ba be 2e 2e 2e
) não é uma sequência UTF8 válida. VejaLC_ALL, LC_CTYPE, LANG
na página de manual do Grep e observe também que ele diz: "O ponto . corresponde a qualquer caractere único. Não é especificado se corresponde a um erro de codificação. " (ênfase minha)