如何对任意编码的文件使用 grep/ack?

Eug*_*ash 8 grep character-encoding locale

在我的 Linux 桌面上,我有一个 UTF-8 语言环境。当我尝试使用 grep (ack) 搜索一些 KOI8-R 编码文件时,它失败了。如果我手动将模式编码为 KOI8-R 并将其作为参数传递,它会起作用。

是否可以告诉 grep 该模式使用什么编码?或者其他什么工具?

Gil*_*il' 6

如果您搜索的所有文件都具有相同的编码:

LC_CTYPE=ru_RU.KOI8-R luit ack-grep "$(echo '??????' | iconv -t KOI8-R)" *.txt
Run Code Online (Sandbox Code Playgroud)

或在 bash 或 zsh 中

LC_CTYPE=ru_RU.KOI8-R luit ack-grep "$(iconv -t KOI8-R <<<'??????')" *.txt
Run Code Online (Sandbox Code Playgroud)

或者以所需的编码启动子 shell:

$ LC_CTYPE=ru_RU.KOI8-R luit
$ ack-grep '??????' *.txt
$ exit
Run Code Online (Sandbox Code Playgroud)

Luit(随 XFree86 和 X.org 一起提供)在设置指定的语言环境中运行在其命令行中指定的程序LC_CTYPE,假设使用 UTF-8 终端。因此该命令在所需的语言环境中运行,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
Run Code Online (Sandbox Code Playgroud)

配置文件iconv-koi8r-utf8.conf包含

ext_in =
ext_out = *.utf8
flt_in =
flt_out = .utf8
flt_cmd = iconv -f KOI8-R -t UTF-8
Run Code Online (Sandbox Code Playgroud)