1

一个文件夹中存在三个相同txt的文件,每个文件里面只有一个单词:“你好”。第一个文件在 中编码UTF-8,第二个在UTF-16,最后一个在UTF-32(在 linux 上创建的所有文件)。但是使用 grep

grep -i "hello" *.txt

只返回一个结果,它是UTF-8-file。Grep 找不到其他两个文件。

如何 grep 部分包含UTF-16UTF-32编码文件的文件夹?

4

1 回答 1

1

一种方法使用perl代替grep

$ perl -CO -Mopen="IN,:encoding(UTF-16)" -ne 'print if /hello/i' utf16_file.txt

UTF-32 文件的明显变化。

这告诉perl使用 UTF-8 进行输出,打开读取的文件以 UTF-16 编码,并且只打印(不区分大小写)匹配//'s 中的正则表达式的行。

或者iconv先用来转换文件:

$ iconv -f UTF-16 -t UTF-8 utf16_file.txt | grep -i hello

如果您没有一种简单的方法可以从文件名中分辨出它是什么编码,那么可能类似于这个脚本用于file尝试猜测编码然后iconv转换为 UTF-8 以提供给 GNU grep:

#!/bin/sh

# This assumes we're running in a UTF-8 locale
to_charset=UTF-8

regexp="$1"
shift 1

for file in "$@"; do
    case "$(file "$file")" in
        *UTF-16*) charset=UTF-16;;
        *UTF-32*) charset=UTF-32;;
        *UTF-8*) charset=UTF-8;;
        *ASCII*) charset=ASCII;;
        *) echo "$file has an unknown encoding." >&2
           charset=ASCII;;
    esac
    #echo "Using $charset for $file"
    iconv -f "$charset" -t "$to_charset" "$file" | \
        grep -i -H --label "$file" "$regexp"
done

用法:smartgrep hello *.txt

于 2020-07-17T10:24:59.653 回答