`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, а также обратите внимание, что там говорится: «Точка . соответствует любому одиночному символу. Неизвестно, соответствует ли это ошибке кодирования." (выделено мной)

Связанный контент