问题 findstr或grep自动检测字符编码(UTF-16)


我想做这个:

 findstr /s /c:some-symbol *

或grep等价物

 grep -R some-symbol *

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

有什么建议么?


我指的是Windows Vista和XP。


4100
2018-01-02 21:28


起源

你的一些文件是UTF-16,有些是ASCII,还是什么? - Artelius
是的,一些ASCII,一些UTF-16。 - David Martin


答案:


谢谢你的建议。我指的是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字符编码。


4
2018-01-04 13:55



在他们的家庭unix环境中,UTF-16不常见,文件通常是UTF-8,它们处理得很好。 - bdonlan
也许不是很好地提取整行,但完美的尝试找到包含字符串的所有文件(我正在尝试做)。谢谢。 - Kevin Shea


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

find /i /n "YourSearchString" *.*

唯一的问题是打印文件名后跟匹配。您可以通过管道到findstr来过滤它们

find /i /n "YourSearchString" *.* | findstr /i "YourSearchString"

3
2017-07-21 20:31



不幸的是,find命令不支持匹配模式,如findstr(通配符/正则表达式)。 - Mister_Tom


findstr /s /c:some-symbol *

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

for /r %f in (*) do @find /i /n "some-symbol" "%f"

2
2018-01-09 19:23



如果在下面添加Venkateshwar的答案,你得到:for / r%f in(*)do @find / i / n“some-symbol”“%f”| findstr / i“some-symbol”将过滤掉文件名。我发现这在搜索一组寻找“失败”的文件时很有用。我不在乎它出现在哪个文件中,我只是想看看是否有任何文件中有“失败”。 - Eli


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

TYPE UTF-16.txt > ASCII.txt

然后你可以使用FINDSTR。

FINDSTR object ASCII.txt

1
2017-09-04 15:58



...原谅,什么? - Mehrdad


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

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

type *.* | findstr /s /c:some-symbol

1
2018-01-24 22:46





根据这个 博客文章 正如您所发现的那样,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文件。


0
2018-01-02 22:22





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

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


0
2018-01-03 14:50