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