제가 작업 중인 일부 코드에는 일본어로 작성된 주석이 많이 있는데 이를 영어로 번역하려고 합니다. 일본어 문자나 적어도 ASCII가 아닌 문자가 포함된 모든 줄을 "grep"하는 방법이 있습니까?
답변1
ASCII가 아닌 문자를 찾는 것은 간단합니다. ASCII 문자만 유효한 로캘을 설정하고 잘못된 문자를 검색하면 됩니다.
LC_CTYPE=C grep '[^[:print:]]' myfile
일본어 문자를 검색하려면 좀 더 복잡합니다. grep을 사용하면 LC_CTYPE
로케일이 파일 인코딩과 일치하는지 확인해야 합니다 . LC_COLLATE
문자 범위 표현식을 사용하려면 설정이 일본어로 설정되어 있는지도 확인해야 합니다. 예를 들어, Linux에서는 (섹션을 보고 일본어로 간주되는 첫 번째와 마지막 문자를 결정했습니다 LC_COLLATE
) /usr/share/i18n/locales/ja_JP
:
LC_CTYPE=ja_JP.UTF-8 LC_COLLATE=ja_JP.UTF-8 egrep '[。-龥]' myfile
또는 스크립트에서 ASCII를 고수하려는 경우
LC_CTYPE=ja_JP.UTF-8 LC_COLLATE=ja_JP.UTF-8 egrep $'[\uff61-\u9fa5]' myfile
ⓒ
여기에는 및 와 같이 영어에서도 사용되는 일부 구두점이 포함됩니다 ×
.
Perl에는 문자 분류 기능이 내장되어 있습니다. 당신은 그것을 사용할 수 있습니다\p
캐릭터 클래스다음을 기준으로 문자 일치유니코드 속성. 통과하다명령줄 스위치-CSD
Perl에게 모든 것이 UTF-8로 인코딩된 유니코드임을 알려줍니다.
perl -CSD -ne 'print if /\p{Hiragana}|\p{Katakana}/' myfile
파일이 UTF-8로 인코딩되지 않은 경우 다음을 호출해야 합니다.binmode
Perl에게 인코딩을 명시적으로 알려주세요. 이건 너무 고급이죠?글로벌 로케일나를 위한 사용법. 아니면 할 수 있습니다먼저 해당 줄을 UTF-8로 다시 인코딩하세요..
또는 Perl에서는 숫자 문자 범위를 사용할 수 있습니다. 예를 들어 히라가나 및 가타카나 유니코드 블록에서 문자를 검색하려면 다음을 수행합니다.
perl -CSD -ne 'print if /[\x{3040}-\x{30ff}]/' a
답변2
이 시도:
grep '[^[:print:][:space:]]'
(로케일에 따라 앞에 추가해야 할 수도 있습니다 LANG=C
.)
답변3
Perl을 사용하는 것이 마음에 들지 않는다면 클래스 형태로 광범위한 유니코드 지원이 있습니다. 예를 들어 Perl은 {Katakana}
일부 {Hiragana}
PCRE 지원을 제공하는 grep 버전에서도 현재 이러한 클래스를 사용할 수 없다고 생각합니다. 그러나 명시적인 UTF-8 디코딩이 필요한 것 같습니다.
perl -MEncode -ne 'print if decode("UTF-8",$_) =~ /\p{Hiragana}/' somefile
grep의 -R과 같은 디렉토리를 탐색하려면 find
다음과 같은 명령을 사용할 수 있습니다.
find -type f -exec perl -MEncode -ne 'print if decode("UTF-8",$_) =~ /\p{Hiragana}/' {} \;
filename:match
또는 재귀 grep의 기본 토큰 출력 형식을 모방하려면 ,
find -type f -exec perl -MEncode -lne 'printf "%s:%s\n",$ARGV,$_ if decode("UTF-8",$_) =~ /\p{Hiragana}/' {} \;
답변4
내 파일은 iso-8859-1 인코딩이므로 기본 로케일(utf-8)에서 입력을 읽으려고 하면 일본어 문자를 인식하지 못합니다. 마지막으로 다음 명령을 사용하여 문제를 해결했습니다.
env LC_CTYPE=iso-8859-1 grep -nP '[\x80-\xff]' ./*
-P를 사용하면 문자 범위에서 Perllike 구문을 사용할 수 있습니다.
-n은 라인 이름 옆에 라인 번호를 인쇄하는 데 사용됩니다.
\x80
to는 \xff
"비ASCII" 문자입니다.
LC_CTYPE 환경 변수를 iso-8859-1로 변경하면 grep이 내 필드를 바이트 단위로 읽고 "확장된 ASCII" 바이트를 가능한 일본어 문자로 감지할 수 있게 되었습니다. UTF-8의 기본 시스템 인코딩을 사용하는 경우 grep은 "입력의 잘못된 UTF-8 바이트 시퀀스" 오류와 함께 종료됩니다.