findstr 或 grab 自动检测字符编码 (UTF-16)
Posted
技术标签:
【中文标题】findstr 或 grab 自动检测字符编码 (UTF-16)【英文标题】:findstr or grep that autodetects chararacter encoding (UTF-16) 【发布时间】:2010-09-29 07:33:31 【问题描述】:我想这样做:
findstr /s /c:some-symbol *
或 grep 等价物
grep -R some-symbol *
但我需要该实用程序来自动检测以 UTF-16(和朋友)编码的文件并适当地搜索它们。我的文件中甚至还有字节排序标记 FFEE,所以我什至不寻找英雄的自动检测。
有什么建议吗?
我指的是 Windows Vista 和 XP。
【问题讨论】:
您的文件中有些是 UTF-16 还是有些是 ASCII,还是什么? 是的,一些 ASCII,一些 UTF-16。 【参考方案1】:根据 Damon Cortesi 的 blog article,正如您所发现的,grep 不适用于 UTF-16 文件。但是,它提出了这种解决方法:
for f in `find . -type f | xargs -I file | grep UTF-16 | cut -f1 -d\:`
do iconv -f UTF-16 -t UTF-8 $f | grep -iH --label=$f $GREP_FOR
done
这显然适用于 Unix,不确定 Windows 上的等价物是什么。那篇文章的作者还提供了一个 shell 脚本来执行上述操作,您可以在 github here 上找到。
这仅 greps UTF-16 文件。您还可以以正常方式 grep ASCII 文件。
【讨论】:
【参考方案2】:您没有说要在哪个平台上执行此操作。
在 Windows 上,您可以使用 PowerGREP,它会自动检测以字节顺序标记开头的 Unicode 文件。 (还有一个选项可以自动检测没有 BOM 的文件。自动检测对于 UTF-8 非常可靠,但对于 UTF-16 是有限的。)
【讨论】:
【参考方案3】:感谢您的建议。我指的是 Windows Vista 和 XP。
我还发现了这个解决方法,使用免费的Sysinternals strings.exe
:
C:\> strings -s -b dir_tree_to_search | grep regexp
Strings.exe
提取它找到的所有字符串(来自二进制文件,但也适用于文本文件)并在每个结果前面加上文件名和冒号,因此在正则表达式中考虑到这一点(或使用 cut 或其他步骤在管线中)。 -s
使它进行递归提取,-b
只是抑制横幅消息。
最终我还是有点惊讶,旗舰搜索实用程序 Gnu grep
和 findstr
不能原生处理 Unicode 字符编码。
【讨论】:
在他们的家庭 unix 环境中,UTF-16 不太常见,文件通常是 UTF-8,它们处理得很好。 对于提取整行可能不是很好,但对于尝试查找包含字符串的所有文件(我正在尝试这样做)是完美的。谢谢。【参考方案4】:在 Windows 上,您也可以使用 find.exe。
find /i /n "YourSearchString" *.*
唯一的问题是这会打印文件名,然后是匹配项。您可以通过管道过滤它们到 findstr
find /i /n "YourSearchString" *.* | findstr /i "YourSearchString"
【讨论】:
不幸的是 find 命令不支持像 findstr(通配符/正则表达式)这样的匹配模式。【参考方案5】:解决方法是将 UTF-16 转换为 ASCII 或 ANSI
TYPE UTF-16.txt > ASCII.txt
然后你可以使用 FINDSTR。
FINDSTR object ASCII.txt
【讨论】:
...对不起,什么? 或type UTF-16.txt | findstr
如果您不需要文件名(OP 需要文件名,因为搜索多个文件,但有些人可能会觉得这很有用)【参考方案6】:
findstr /s /c:some-symbol *
可以替换为以下字符编码感知命令:
for /r %f in (*) do @find /i /n "some-symbol" "%f"
【讨论】:
如果在下面添加 Venkateshwar 的答案,你会得到: for /r %f in (*) do @find /i /n "some-symbol" "%f" | findstr /i "some-symbol" 将过滤掉文件名。在搜索一组寻找“失败”的文件时,我发现这很有用。我不在乎它出现在哪个文件中,我只是想看看是否有任何文件中有“失败”。【参考方案7】:在更高版本的 Windows 中,UTF-16 支持开箱即用。如果没有,请尝试通过chcp
命令更改活动代码页。
在我的情况下,单独使用 findstr
无法处理 UTF-16 文件,但它适用于 type
:
type *.* | findstr /s /c:some-symbol
【讨论】:
以上是关于findstr 或 grab 自动检测字符编码 (UTF-16)的主要内容,如果未能解决你的问题,请参考以下文章