`grep -z -a -b -P --only-matching 'LUKS\xba\xbe'` no coincide con `LUKS\xba\xbe...`

`grep -z -a -b -P --only-matching 'LUKS\xba\xbe'` no coincide con `LUKS\xba\xbe...`

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 grepcomando 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 localepara 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 grepse 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, LANGla 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)

información relacionada