많은 수의 레코드가 포함된 텍스트 파일이 있는데, 각 레코드는 한 줄을 차지합니다. 일부 레코드에 손상된 특수 문자가 있으며 위의 여러 문자 시퀀스를 찾아 이를 찾으려고 합니다.x80
다음은 잘못된 문자가 강조 표시된 한 줄의 예입니다.
관심 있는 16진수 문자열은 다음과 같습니다.
49 CC 80 C2 B9 6E
GNU Grep을 사용하면 grep --color='auto' -P -n "[\x80-\xFF]" record.txt
줄의 일부만 일치하고 위 첨자 1( ¹
)과 일치하지만 다음은 일치하지 않습니다 Ì
.
Grep은 결합된 문자 + 발음 구별 부호를 분리할 수 없는 것 같습니다...
내가 원하는 것은 x80
두 개 이상의 연속 문자가 있는 줄만 유지하고 16진수 코드에 표시된 실제 문자와 일치할 수 있는 것입니다. 즉, 49 CC 80 C2 B9 6E
이와 유사한 것과 일치해야 하는 것처럼 보이지만 "[\x80-\xFF]{2,10}"
이 일치는 실제로 작동하지 않습니다.
따라서 명확히 하기 위해 이것을 사용하면 다음 줄이 일치합니다.
grep --color='auto' -P -n "[\x80-\xFF]" record.txt
그러나 내가 그것을 사용하면 다음과 같은 일이 발생하지 않습니다.
grep --color='auto' -P -n "[\x80-\xFF]{2,10}" record.txt
바이트 시퀀스는 CC 80 C2 B9
값이 있는 4개의 연속 바이트 문자열 이므로 두 번째 것도 일치하면 안 되나요 x80-xFF
?
답변1
이는 로케일 설정과 관련이 있을 수 있습니다. 그렇다면 C(POSIX라고도 함) 로케일(문자는 바이트임)을 사용하면 작동할 수 있습니다.
LC_ALL=C grep --color='auto' -P -n "[\x80-\xFF]{2,10}" record.txt
답변2
Grep은 이상한 문자로 인해 이상해질 수 있습니다. 다음을 시도해 보세요.
grep --color='auto' -P -n "[\x80-\xFF]" record.txt | iconv -f utf-16 -t utf-16
편지를 다시 받을 수도 있지만... 색깔은 사라질 것입니다. utf-16 및 utf-8에 대해 수정하는 것이 좋습니다.
그리고 콘솔이 uft-8을 처리할 수 있고 일부 ansi 설정에 할당되지 않았는지 확인하세요.