如何对文本文件中的特定字符串进行二分搜索?

如何对文本文件中的特定字符串进行二分搜索?

我有一个文本文件,其中包含大量记录,每条记录都占一行。一些记录具有已损坏的特殊字符,我试图通过查找高于的多个字符序列来找到这些字符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 设置。

相关内容