
한 줄에 많은 수의 레코드가 포함된 텍스트 파일이 있습니다. 일부 기록에 손상된 특수 문자가 있는데, 다음보다 높은 여러 문자 시퀀스를 찾아 이를 찾으려고 합니다.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 설정에 할당되어 있지 않은지 확인하세요.