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.