13

我想做这个:

 findstr /s /c:some-symbol *

或 grep 等价物

 grep -R some-symbol *

但我需要该实用程序来自动检测以 UTF-16(和朋友)编码的文件并适当地搜索它们。我的文件中甚至还有字节排序标记 FFEE,所以我什至不寻找英雄的自动检测。

有什么建议么?


我指的是 Windows Vista 和 XP。

4

7 回答 7

5

一种解决方法是将 UTF-16 转换为 ASCII 或 ANSI

TYPE UTF-16.txt > ASCII.txt

然后你可以使用 FINDSTR。

FINDSTR object ASCII.txt
于 2012-09-04T15:58:25.197 回答
4

感谢您的建议。我指的是 Windows Vista 和 XP。

我还使用免费的Sysinternalsstrings.exe发现了这种解决方法:

C:\> strings -s -b dir_tree_to_search | grep regexp 

Strings.exe提取它找到的所有字符串(来自二进制文件,但也适用于文本文件)并在每个结果前面加上文件名和冒号,因此在正则表达式中考虑到这一点(或使用 cut 或管道中的其他步骤)。这-s使它进行递归提取并-b仅抑制横幅消息。

最终,我仍然对旗舰搜索实用程序 Gnugrep并且findstr不原生处理 Unicode 字符编码感到惊讶。

于 2009-01-04T13:55:54.217 回答
3
findstr /s /c:some-symbol *

可以用以下字符编码感知命令替换:

for /r %f in (*) do @find /i /n "some-symbol" "%f"
于 2013-01-09T19:23:45.013 回答
3

在 Windows 上,您还可以使用 find.exe。

find /i /n "YourSearchString" *.*

唯一的问题是这会打印文件名,然后是匹配项。您可以通过管道过滤它们到 findstr

find /i /n "YourSearchString" *.* | findstr /i "YourSearchString"
于 2011-07-21T20:31:56.060 回答
1

根据 Damon Cortesi 的这篇博客文章,您发现 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 上找到

这只 greps 是 UTF-16 的文件。您还可以以正常方式 grep ASCII 文件。

于 2009-01-02T22:22:45.943 回答
1

在更高版本的 Windows 中,UTF-16 支持开箱即用。chcp如果没有,请尝试通过命令更改活动代码页。

在我的情况下,findstr单独使用 UTF-16 文件失败,但它适用于type

type *.* | findstr /s /c:some-symbol
于 2017-01-24T22:46:41.620 回答
0

您没有说要在哪个平台上执行此操作。

在 Windows 上,您可以使用PowerGREP,它会自动检测以字节顺序标记开头的 Unicode 文件。(还有一个选项可以自动检测没有 BOM 的文件。自动检测对于 UTF-8 非常可靠,但对于 UTF-16 是有限的。)

于 2009-01-03T14:50:27.477 回答