web-dev-qa-db-ja.com

任意のエンコーディングのファイルでgrep / ackを使用するにはどうすればよいですか?

Linuxデスクトップには、UTF-8ロケールがあります。 KOI8-Rでエンコードされたファイルをgrep(ack)で検索しようとすると失敗します。パターンを手動でKOI8-Rにエンコードし、それを引数として渡すと、機能します。

パターンに使用するエンコーディングをgrepに指示することは可能ですか?または他のツール?

8
Eugene Yarmash

検索するすべてのファイルのエンコーディングが同じ場合:

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

Luit (XFree86およびX.orgに同梱)は、UTF-8端末を想定して、LC_CTYPE設定で指定されたロケールでコマンドラインで指定されたプログラムを実行します。そのため、コマンドは目的のロケールで実行され、Luitは端末出力をUTF-8に変換します。

別のアプローチは、異なるエンコーディングのファイルが多数あるディレクトリツリーがある場合、好みのエンコーディングでそのディレクトリツリーのビューをマウントすることです。 fuseflt ファイルシステムがこれを実行できると思います(テストされていません)。

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