grep/ack를 사용하여 임의로 인코딩된 파일을 처리하는 방법은 무엇입니까?

grep/ack를 사용하여 임의로 인코딩된 파일을 처리하는 방법은 무엇입니까?

내 Linux 데스크탑에는 UTF-8 로케일이 있습니다. 일부 KOI8-R 인코딩 파일을 검색하기 위해 grep(ack)을 사용하려고 하면 실패합니다. 패턴을 KOI8-R로 수동으로 인코딩하고 매개변수로 전달하면 작동합니다.

패턴이 사용하는 인코딩을 grep에게 알릴 수 있습니까? 아니면 다른 도구가 있나요?

답변1

검색하려는 모든 파일의 인코딩이 동일한 경우:

LC_CTYPE=ru_RU.KOI8-R luit ack-grep "$(echo 'привет' | iconv -t KOI8-R)" *.txt

아니면 bash나 zsh에서

LC_CTYPE=ru_RU.KOI8-R luit ack-grep "$(iconv -t KOI8-R <<<'привет')" *.txt

또는 원하는 인코딩으로 서브셸을 시작합니다.

$ LC_CTYPE=ru_RU.KOI8-R luit
$ ack-grep 'привет' *.txt
$ exit

루잇LC_CTYPE(XFree86 및 X.org와 함께 제공) UTF-8 터미널을 가정하고 설정에 지정된 로케일에서 명령줄에 지정된 프로그램을 실행합니다 . 따라서 명령은 원하는 로케일에서 실행되고 Luit는 터미널 출력을 UTF-8로 변환합니다.

디렉토리 트리에 서로 다른 인코딩의 파일이 많이 포함되어 있는 경우, 또 다른 접근 방식은 선호하는 인코딩으로 디렉토리 트리 보기를 설치하는 것입니다. 제 생각에는퓨즈파일 시스템은 이를 수행할 수 있습니다(테스트되지 않음).

mkdir /utf8-view
fuseflt iconv-koi8r-utf8.conf /some/dir /utf8-view
ack-grep 'привет' /utf8-view/*.txt.utf8
fusermount -u /utf8-view

구성 파일이 iconv-koi8r-utf8.conf포함 된 위치

ext_in =
ext_out = *.utf8
flt_in =
flt_out = .utf8
flt_cmd = iconv -f KOI8-R -t UTF-8

관련 정보