【问题标题】:grep unicode 16 supportgrep unicode 16 支持
【发布时间】:2011-10-16 11:02:45
【问题描述】:

我在macosx上使用TextEdit创建了两个文件,内容相同,编码不同,然后

grep xxx filename_UTF-16

什么都没有

grep xxx filename_UTF-8

xxxxxx xxxxxxyyyyyy

grep did not support UTF-16?

【问题讨论】:

  • 这个应该移到 unix.stackexchange.com
  • 我还想补充一点,您可能会编写一个 C 程序来在发布和寻找答案所需的时间内搜索文件中的字符串。

标签: linux unicode utf-8 grep utf-16


【解决方案1】:

您总是可以先尝试转换为 utf-8:

iconv -f utf-16 -t utf-8 filename | grep xxxxx

【讨论】:

    【解决方案2】:
    iconv -f UTF-16 -t UTF-8 yourfile | grep xxx
    

    【讨论】:

      【解决方案3】:

      使用ripgrep utility 代替grep,后者可以支持对UTF-16 文件进行grepping。安装者:brew install ripgrep

      然后运行:

      rg xxx filename_UTF-16
      

      ripgrep 支持以 UTF-8 以外的文本编码搜索文件,例如 UTF-16、latin-1、GBK、EUC-JP、Shift_JIS 等。 (提供了一些自动检测UTF-16的支持。其他文本编码必须用-E/--encoding flag.专门指定)

      【讨论】:

      • 如果您需要递归搜索目录,这是最好的解决方案:rg -E UTF-16 <PATTERN> <PATH>
      【解决方案4】:

      定义以下 Ruby 的 shell 函数:

      grep16() { ruby -e "puts File.open('$2', mode:'rb:BOM|UTF-16LE').readlines.grep(Regexp.new '$1'.encode(Encoding::UTF_16LE))"; }
      

      然后将其用作:

      grep16 xxx filename_UTF-16
      

      见:How to use Ruby's readlines.grep for UTF-16 files?

      更多建议,请查看:grepping binary files and UTF16

      【讨论】:

        【解决方案5】:

        您也可以使用ugrep,根据其自述文件支持UTF-8、UTF-16、UTF-32等文件格式:

        ugrep 在 UTF BOM(字节顺序标记)时搜索 UTF 编码的输入。选项 --encoding 允许搜索许多其他文件格式,例如 ISO-8859-1、EBCDIC 和代码页 437、850、858、1250 到 1258。

        ugrep 默认匹配 Unicode 模式(通过选项 -U 禁用)。 正则表达式语法符合 POSIX ERE,扩展为 Unicode 字符类、惰性量词和否定模式 跳过不需要的模式匹配以产生更精确的结果。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2020-03-22
          • 2012-09-12
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-05-14
          • 2011-04-15
          • 2014-12-25
          相关资源
          最近更新 更多