Wie verwende ich grep / ack mit Dateien in beliebiger Codierung?

8

Auf meinem Linux-Desktop habe ich ein UTF-8-Gebietsschema. Wenn ich versuche, einige KOI8-R-codierte Dateien mit grep (ack) zu durchsuchen, schlägt dies fehl. Wenn ich das Muster manuell in KOI8-R codiere und es als Argument übergebe, funktioniert es.

Kann man grep mitteilen, welche Codierung für das Muster verwendet werden soll? Oder irgendein anderes Werkzeug?

Eugene Yarmash
quelle

Antworten:

6

Wenn alle Dateien, in denen Sie suchen, dieselbe Codierung haben:

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

oder in bash oder zsh

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

Oder starten Sie eine untergeordnete Shell in der gewünschten Codierung:

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

Luit (im Lieferumfang von XFree86 und X.org enthalten) führt das in der Befehlszeile angegebene Programm in dem durch die LC_CTYPEEinstellung angegebenen Gebietsschema aus , wobei ein UTF-8-Terminal vorausgesetzt wird. Der Befehl wird also im gewünschten Gebietsschema ausgeführt, und Luit übersetzt seine Terminalausgabe in UTF-8.

Ein anderer Ansatz, wenn Sie einen Verzeichnisbaum mit vielen Dateien in einer anderen Codierung haben, besteht darin, eine Ansicht dieses Verzeichnisbaums unter einer von Ihnen bevorzugten Codierung bereitzustellen. Ich denke, das fuseflt- Dateisystem kann dies (ungetestet).

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

wo die Konfigurationsdatei iconv-koi8r-utf8.confenthält

ext_in =
ext_out = *.utf8
flt_in =
flt_out = .utf8
flt_cmd = iconv -f KOI8-R -t UTF-8
Gilles 'SO - hör auf böse zu sein'
quelle
@eugeney Blöd, ich habe vergessen, dass du das Muster auch übersetzen musst, also ist es etwas komplizierter als das, was ich geschrieben habe. Das tut mir leid. Ich habe meine Antwort aktualisiert.
Gilles 'SO - hör auf böse zu sein'