Pet*_*r.O 3 grep perl text-processing regular-expression unicode
编辑:由于沃伦·杨的评论,这让我意识到我在一个非常相关的问题上不清楚。我的搜索字符串已经是 UTF-16LE 顺序(不是 Unicode Codepoint 顺序,即 UTF-16BE),所以也许 Unicode 问题有点没有实际意义,
也许我的问题是我如何 grep 以2 字节为一组的字节(不是字符),即。这样 UTF-16LE\x09\x0A就不会被视为 TAB、换行符,而是被视为 2 个字节,而碰巧是 UTF-16LE ??... 注意:我不需要关心 UTF-16 代理对,所以 2 字节块就可以了。
以下是此 3 字符字符串的示例模式???:
\x09\x0A\x09\x2A\x09\x30
但它什么都不返回,尽管字符串在文件中。
(这里是原帖)
在搜索具有\x00\x01\x...etc格式模式的 UTF-16LE 文件时,我遇到了某些值的问题。我一直在使用sed(并尝试过grep),但是在 UTF-8 语言环境中,他们将某些 UTF-16LE 值识别为 ASCII 字符。我被锁定在使用 UTF-16,因此重新编码为 UTF-8 不是一种选择。
例如。在此文本?(UNICODE 090A) 中,虽然它是单个字符,但?被视为两个 ASCII 字符\x09和\x0A.
grep有一个-P(perl) 选项可以搜索\x00\x...模式,但我得到了相同的 ASCII 解释。
是否有某种方法可以用于grep -P在 UTF-16 模式下进行搜索,或者可能更好,如何通过 perl 或其他一些脚本来完成此操作。
grep 似乎是最吸引人的,因为它的紧凑性,但无论完成工作,都会压倒这种偏好。
PS; 我的?示例使用文字字符串,但我的实际使用需要正则表达式样式搜索。所以这个 perl 示例并不是我想要的,尽管它确实将文件作为 UTF-16 处理......我宁愿不必打开和关闭文件......我认为perl有更紧凑的基本方法诸如正则表达式搜索之类的东西。我追求的是那种紧凑的语法。
我的回答与您在此主题上的其他问题基本相同:
$ iconv -f UTF-16LE -t UTF-8 myfile.txt | grep pattern
Run Code Online (Sandbox Code Playgroud)
与另一个问题一样,您可能还需要行结束转换,但重点是您应该将文件转换为本地编码,以便您可以直接使用本机工具。