我正在尝试通过 grep 获取一系列 UTF-8 编码字符的十六进制值,我只想返回特定范围的字符。 我目前有这个:
grep -P -n "[\xB9-\xBF]" $str_st_location >> output_st.txt
但这会返回在其十六进制表示中具有任何这些十六进制值的每个字符,即只要 B9 存在,它就会返回 00B9 - FFB9。
有没有一种方法可以使用 grep 指定我只需要我搜索的确切/特定的十六进制值范围?
示例输入:
STRING_OPEN
Open
æ–å¼€
Ouvert
Abierto
Открыто
Abrir
现在使用我的 grep 语句,它应该返回第 3 行和第 6 行,但它还在我的文件中包含一些俄语和中文文本,因为语言范围包括我正在搜索的十六进制值,如下所示:
断开
Открыто
很遗憾,由于工作相关,我无法提供更多示例输入。
编辑:实际上下面的代码片段有效!
grep -P -n "[\x{00B9}-\x{00BF}]" $str_st_location > output_st.txt
它发现了所有损坏的字符并且没有误报。现在唯一的问题是带有损坏字符的行会自动“未损坏”,即当我打开文件时,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
关于bash - 如何grep字符的精确十六进制值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31139737/