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

标签 bash unix scripting grep

我正在尝试通过 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/

相关文章:

windows - Windows 上的 Bash - exe 文件的别名

shell - 在 Unix 中使用 Less 转到特定行号

javascript - Javascript 应用程序中是否有脚本扩展的先例?

python - Bash/python/perl 神奇地获取多个日志文件中的聚合日期时间

regex - sed 匹配并替换文件中的注释除外

bash - 对数千个文件进行更快的迭代

linux - 为什么 bash 的 flock with timeout 获取锁失败不退出?

linux - 在 unix 中使用 find 命令搜索换行符

linux - windows环境下运行Linux Shell脚本

linux : compare just a part of two directory names