`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

핵심요약: 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 매뉴얼 페이지를 참조 하고 "마침표 .는 모든 단일 문자와 일치합니다. grepLUKS\xba\xbe...4c 55 4b 53 ba be 2e 2e 2eLC_ALL, LC_CTYPE, LANG인코딩 오류와 일치하는지 여부는 지정되지 않습니다."(강조)

관련 정보