grep : 일본어 한자가 포함 된 모든 줄 찾기


14

거대한 UTF-8 텍스트 파일에서 일본어 한자 가 포함 된 모든 줄을 표시하고 싶습니다 . 이것은
어떤 grep(또는 다른) 표현입니까?

내가 실수하지 않으면 간지가 \u4e00와 사이의 문자 \u4dbf입니다.

나는 kanas 를 보여줄 필요는 없지만 , 그것들을 보여주는 것도 큰 문제는 아닙니다.

답변:


12

일본어를 사용하지 않는 한 표의 문자에서 중국어 한자를 구별하는 것은 (거대한 테이블을 사용하지 않고) 불가능합니다 (예 : 중국어 또는 한국어 변형).

기본 범위 (\ 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]"

잘 작동합니다!
Nicolas Raoul

4

다섯 번째 테이블에 따라 여기 한자의 caracters 사이 \u4e00\u9fff

내 구현은 grep유니 코드 문자 (Archlinux의 GNU grep 2.14)를 처리 할 수 ​​없지만 여전히 사용할 수 있습니다 \x. 여기 에서 해당 코드를 찾 거나 hexedit얻을 수 있는 도구를 사용할 수 있습니다.

위의 관심 범위에 해당하는 항목에 대해 e9 be a5"잘못된 데이터 정렬 문자"가 반환되었으므로 이것이 내가 찾은 것입니다.

grep "["$'\xe4\xb8\x80'"-"$'\xe9\xbe\xa5'"]" file.txt

너무 작동하지만, 파블로는 ... 조금 더 빨랐다 일
니콜라스 라울

3
이는에 해당합니다 grep "[一-龥]". 문제는 로케일에 따라 다르며 데이터 정렬 규칙을 사용한다는 것입니다. 즉, 정렬 순서가 정의 된 요소 만 범위에서 사용되거나 일치 될 수 있습니다. -P스위치는 관계없이 로케일의 바이너리 매칭을 수행합니다. 로케일 기반 접근 방식은 "문자 범위"의 문화적 정의를 사용하고 이진 기반 접근 방식은 "범위"의 인코딩 값 정의를 사용합니다. 특히 알파벳 스크립트의 경우 출력이 매우 다릅니다. (여기 한족 ideographics 것이 거의 동등)
파블로 Saratxaga
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.