最简单的方法是将文本文件转换为 utf-8 并将其通过管道传输到 grep:
iconv -f utf-16 -t utf-8 file.txt | grep query
我试图做相反的事情(将我的查询转换为 utf-16),但似乎 grep 不喜欢那样。我认为这可能与字节顺序有关,但我不确定。
似乎 grep 会将 utf-16 的查询转换为 utf-8/ascii。这是我尝试过的:
grep `echo -n query | iconv -f utf-8 -t utf-16 | sed 's/..//'` test.txt
如果 test.txt 是一个 utf-16 文件,这将不起作用,但如果 test.txt 是 ascii 则它确实有效。我只能得出结论,grep 正在将我的查询转换为 ascii。
编辑:这是一个非常疯狂的工作,但没有给你非常有用的信息:
hexdump -e '/1 "%02x"' test.txt | grep -P `echo -n Test | iconv -f utf-8 -t utf-16 | sed 's/..//' | hexdump -e '/1 "%02x"'`
它是如何工作的?好吧,它将您的文件转换为十六进制(没有 hexdump 通常适用的任何额外格式)。它通过管道将其输入 grep。 Grep 使用的查询是通过将您的查询(不带换行符)回显到 iconv 中构建的,iconv 将其转换为 utf-16。然后将其通过管道传输到 sed 以删除 BOM(用于确定字节顺序的 utf-16 文件的前两个字节)。然后将其通过管道传输到 hexdump,以便查询和输入相同。
不幸的是,如果只有一个匹配项,我认为这最终会打印出整个文件。如果二进制文件中的 utf-16 存储在与您的机器不同的字节序中,这也将不起作用。
EDIT2:知道了!!!!
grep -P `echo -n "Test" | iconv -f utf-8 -t utf-16 | sed 's/..//' | hexdump -e '/1 "x%02x"' | sed 's/x/\\\\x/g'` test.txt
这会在文件 test.txt 中搜索字符串 Test(在 utf-16 中)的十六进制版本