No entiendo (basado enhttps://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 qué grep no coincide (como obviamente debería) y qué tengo que hacer para que coincida?
Probé esos comandos en Tails 4.18 y en openSUSE Leap 15.2.
Respuesta1
TL;DR: El grep
comando interpreta su entrada utilizando la configuración regional actual.
Como mostraste, esto no coincide:
echo -e 'LUKS\xba\xbe...' | grep -z -a -b -P --only-match 'LUKS\xba'
Es más, incluso el .
, que debería coincidir con todo, no coincide:
echo -e 'LUKS\xba\xbe...' | grep -z -a -b -P --only-match 'LUKS.'
Sin embargo, si configuramos la configuración regional para esta sesión...
export LC_ALL=C
Y luego inténtalo de nuevo, funciona:
echo -e 'LUKS\xba\xbe...' | grep -z -a -b -P --only-match 'LUKS\xba'
Su ubicación depende de cómo esté configurado su sistema. Escriba locale
para ver toda la información local. En mi sistema, la configuración regional predeterminada es LC_CTYPE="en_US.UTF-8"
, lo que creo que significa que grep
se espera que la entrada sea UTF8, y la entrada LUKS\xba\xbe...
(hexadecimal 4c 55 4b 53 ba be 2e 2e 2e
) no es una secuencia UTF8 válida. Consulte LC_ALL, LC_CTYPE, LANG
la página de manual de Grep y también tenga en cuenta que dice: "El punto coincide con cualquier carácter. No se especifica si coincide con un error de codificación." (el énfasis es mío)