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

関連情報