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