如何grep字符的精确十六进制值

How to grep for exact hexadecimal value of characters

我正在尝试 grep 以获取一系列 UTF-8 编码字符的十六进制值,我只希望 return 编辑该特定字符范围。 我目前有这个:

grep -P -n "[\xB9-\xBF]" $str_st_location >> output_st.txt

但是这个 returns 每个字符在其十六进制表示中具有任何这些十六进制值,即它 returns 00B9 - FFB9 只要 B9 存在。

有没有一种方法可以使用 grep 指定我只需要搜索的 exact/specific 十六进制值范围?

示例输入:

STRING_OPEN
Open
æ–­å¼€
Ouvert
Abierto
Открыто
Abrir

现在使用我的 grep 语句,它应该 return 第 3 行和第 6 行,但它还在我的文件中包含一些俄语和中文文本,因为语言范围包括十六进制值我'我正在搜索这些:

断开
Открыто

很遗憾,由于工作相关,我无法提供更多样本输入。

编辑:实际上下面的代码片段有效!

grep -P  -n "[\x{00B9}-\x{00BF}]" $str_st_location > output_st.txt

它找到了所有损坏的字符并且没​​有误报。现在唯一的问题是带有损坏字符的行自动获得 "uncorrupted" 即当我打开文件时,grep 的输出是损坏字符的更正版本。例如,它找到 æ–å¼€ 并且在文本文件中显示为断开。

由于您正在使用 -P,您可能正在使用 GNU grep,因为那是 GNU grep 扩展。您的命令可以使用带有 pcre 8.37 和 UTF-8 语言环境的 GNU grep 2.21,但是过去存在多字节字符和字符范围的错误。您可能使用的是旧版本,或者您的语言环境可能设置为使用单字节字符的语言环境。

如果您不想升级,可以通过匹配单个字节来匹配此字符范围,这应该适用于旧版本。您需要将字符转换为字节并搜索字节值。假设UTF-8,U+00B9是C2 B9,U+00BF是C2 BF。将 LC_CTYPE 设置为使用单字节字符的内容(如 C)将确保即使在正确支持多字节字符的版本中它也能匹配单个字节。

LC_CTYPE=C grep -P -n "\xC2[\xB9-\xBF]" $str_st_location >> output_st.txt