답변:
일본어를 사용하지 않는 한 표의 문자에서 중국어 한자를 구별하는 것은 (거대한 테이블을 사용하지 않고) 불가능합니다 (예 : 중국어 또는 한국어 변형).
기본 범위 (\ u4e00 ~ \ u9fff)에서 Han 표의 문자를 감지하려면 3 바이트로 인코딩되며 첫 번째 바이트는 항상 0xe4와 0xe9 사이, 두 번째와 세 번째 바이트는 0x80과 0xbf 사이입니다.
여기에는 두 가지 어려움이 있습니다. 먼저 grep에게 문자가 아닌 바이트를 돌보고 싶다고 말해야합니다. 그런 다음 0xe4, 0xe9, 0x80 및 0xbf 바이트를 입력하여 regexp 표현식에 넣으십시오.
-P 스위치가 둘 다 수행한다는 것을 알았습니다. 원하는 줄은 다음과 같습니다.
grep -P "[\xe4-\xe9][\x80-\xbf][\x80-\xbf]"
가나도 원한다면 :
grep -P "[\xe4-\xe9][\x80-\xbf][\x80-\xbf]|\xe3[\x81-\x83][\x80-\xbf]"
다섯 번째 테이블에 따라 여기 한자의 caracters 사이 \u4e00
및\u9fff
내 구현은 grep
유니 코드 문자 (Archlinux의 GNU grep 2.14)를 처리 할 수 없지만 여전히 사용할 수 있습니다 \x
. 여기 에서 해당 코드를 찾 거나 hexedit
얻을 수 있는 도구를 사용할 수 있습니다.
위의 관심 범위에 해당하는 항목에 대해 e9 be a5
"잘못된 데이터 정렬 문자"가 반환되었으므로 이것이 내가 찾은 것입니다.
grep "["$'\xe4\xb8\x80'"-"$'\xe9\xbe\xa5'"]" file.txt
grep "[一-龥]"
. 문제는 로케일에 따라 다르며 데이터 정렬 규칙을 사용한다는 것입니다. 즉, 정렬 순서가 정의 된 요소 만 범위에서 사용되거나 일치 될 수 있습니다. -P
스위치는 관계없이 로케일의 바이너리 매칭을 수행합니다. 로케일 기반 접근 방식은 "문자 범위"의 문화적 정의를 사용하고 이진 기반 접근 방식은 "범위"의 인코딩 값 정의를 사용합니다. 특히 알파벳 스크립트의 경우 출력이 매우 다릅니다. (여기 한족 ideographics 것이 거의 동등)