Eug*_*ash 8 grep character-encoding locale
在我的 Linux 桌面上,我有一个 UTF-8 语言环境。当我尝试使用 grep (ack) 搜索一些 KOI8-R 编码文件时,它失败了。如果我手动将模式编码为 KOI8-R 并将其作为参数传递,它会起作用。
是否可以告诉 grep 该模式使用什么编码?或者其他什么工具?
如果您搜索的所有文件都具有相同的编码:
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)