一个文件夹中存在三个相同txt
的文件,每个文件里面只有一个单词:“你好”。第一个文件在 中编码UTF-8
,第二个在UTF-16
,最后一个在UTF-32
(在 linux 上创建的所有文件)。但是使用 grep
grep -i "hello" *.txt
只返回一个结果,它是UTF-8
-file。Grep 找不到其他两个文件。
如何 grep 部分包含UTF-16
或UTF-32
编码文件的文件夹?
一种方法使用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