【问题标题】:findstr or grep that autodetects chararacter encoding (UTF-16)findstr 或 grab 自动检测字符编码 (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。

标签: unicode windows-xp windows-vista utf-16 findstr


【解决方案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 grepfindstr 不能原生处理 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
      

      【讨论】:

        猜你喜欢
        • 2012-07-23
        • 2014-01-18
        • 2012-10-12
        • 2012-04-01
        • 2012-03-13
        • 2013-08-17
        • 2023-04-11
        • 2012-02-29
        • 1970-01-01
        相关资源
        最近更新 更多