이해가 안 돼요 (근거에 따르면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
핵심요약: 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
모든 로캘 정보를 보려면 입력하세요 . 내 시스템에서 기본 로케일은 입니다 . 이는 입력이 UTF8일 것으로 예상하고 입력 (hex )이 유효한 UTF8 시퀀스가 아니라는 LC_CTYPE="en_US.UTF-8"
의미라고 생각합니다 . Grep 매뉴얼 페이지를 참조 하고 "마침표 .는 모든 단일 문자와 일치합니다. grep
LUKS\xba\xbe...
4c 55 4b 53 ba be 2e 2e 2e
LC_ALL, LC_CTYPE, LANG
인코딩 오류와 일치하는지 여부는 지정되지 않습니다."(강조)