我有一个文本文件,其中包含大量记录,每条记录都占一行。一些记录具有已损坏的特殊字符,我试图通过查找高于的多个字符序列来找到这些字符x80
这是一个单行示例,其中突出显示了不正确的字符:
感兴趣的十六进制字符串是:
49 CC 80 C2 B9 6E
当我使用 GNU Grep 时,grep --color='auto' -P -n "[\x80-\xFF]" record.txt
它仅匹配该行的一部分,它匹配上标 1 ( ¹
) 但不匹配Ì
:
Grep 似乎无法将组合的字符+变音符号分开......
我想做的是只保留具有两个或多个连续x80
字符的行 - 并且能够匹配十六进制代码中显示的实际字符 - 即49 CC 80 C2 B9 6E
看起来它应该匹配类似的东西"[\x80-\xFF]{2,10}"
- 但这种匹配确实不行。
因此,为了澄清,当我使用它时,该行匹配:
grep --color='auto' -P -n "[\x80-\xFF]" record.txt
但是当我使用它时,它不会:
grep --color='auto' -P -n "[\x80-\xFF]{2,10}" record.txt
第二个不应该也匹配吗,因为字节序列是CC 80 C2 B9
由 4 个连续字节组成的字符串,其值为x80-xFF
?
答案1
这可能与区域设置相关。如果是这样,使用 C(又名 POSIX)语言环境(其中字符是字节)可能会起作用:
LC_ALL=C grep --color='auto' -P -n "[\x80-\xFF]{2,10}" record.txt
答案2
Grep 可能会对奇怪的字符感到奇怪......尝试:
grep --color='auto' -P -n "[\x80-\xFF]" record.txt | iconv -f utf-16 -t utf-16
它可能会找回你的字母......但你的颜色会丢失。可能值得对 utf-16 和 utf-8 进行修改。
并确保您的控制台能够处理 uft-8,并且未分配给某些 ansi 设置。