我想做这个:
findstr /s /c:some-symbol *
或 grep 等价物
grep -R some-symbol *
但我需要该实用程序来自动检测以 UTF-16(和朋友)编码的文件并适当地搜索它们。我的文件中甚至还有字节排序标记 FFEE,所以我什至不寻找英雄的自动检测。
有什么建议么?
我指的是 Windows Vista 和 XP。
我想做这个:
findstr /s /c:some-symbol *
或 grep 等价物
grep -R some-symbol *
但我需要该实用程序来自动检测以 UTF-16(和朋友)编码的文件并适当地搜索它们。我的文件中甚至还有字节排序标记 FFEE,所以我什至不寻找英雄的自动检测。
有什么建议么?
我指的是 Windows Vista 和 XP。
一种解决方法是将 UTF-16 转换为 ASCII 或 ANSI
TYPE UTF-16.txt > ASCII.txt
然后你可以使用 FINDSTR。
FINDSTR object ASCII.txt
感谢您的建议。我指的是 Windows Vista 和 XP。
我还使用免费的Sysinternalsstrings.exe
发现了这种解决方法:
C:\> strings -s -b dir_tree_to_search | grep regexp
Strings.exe
提取它找到的所有字符串(来自二进制文件,但也适用于文本文件)并在每个结果前面加上文件名和冒号,因此在正则表达式中考虑到这一点(或使用 cut 或管道中的其他步骤)。这-s
使它进行递归提取并-b
仅抑制横幅消息。
最终,我仍然对旗舰搜索实用程序 Gnugrep
并且findstr
不原生处理 Unicode 字符编码感到惊讶。
findstr /s /c:some-symbol *
可以用以下字符编码感知命令替换:
for /r %f in (*) do @find /i /n "some-symbol" "%f"
在 Windows 上,您还可以使用 find.exe。
find /i /n "YourSearchString" *.*
唯一的问题是这会打印文件名,然后是匹配项。您可以通过管道过滤它们到 findstr
find /i /n "YourSearchString" *.* | findstr /i "YourSearchString"
根据 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 文件。
在更高版本的 Windows 中,UTF-16 支持开箱即用。chcp
如果没有,请尝试通过命令更改活动代码页。
在我的情况下,findstr
单独使用 UTF-16 文件失败,但它适用于type
:
type *.* | findstr /s /c:some-symbol
您没有说要在哪个平台上执行此操作。
在 Windows 上,您可以使用PowerGREP,它会自动检测以字节顺序标记开头的 Unicode 文件。(还有一个选项可以自动检测没有 BOM 的文件。自动检测对于 UTF-8 非常可靠,但对于 UTF-16 是有限的。)