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

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

在我的 Linux 桌面上,我有一个 UTF-8 语言环境。当我尝试使用 grep (ack) 搜索一些 KOI8-R 编码的文件时,它失败了。如果我手动将模式编码为 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

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

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

卢伊特(随 XFree86 和 X.org 一起提供)在设置指定的语言环境中运行在命令行上指定的程序LC_CTYPE,假设使用 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

相关内容