gpt4 book ai didi

regex - 如何使用十六进制表示来查找特殊字符(控制字符)

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:22:36 27 4
gpt4 key购买 nike

因此,在帮助某人调试一些代码时,我意识到他们的输出中有一些奇怪的字符,即 � 和 �(十六进制的\xc0 和\xd0)。

我想在一个大的文本输出文件中找到这些字符。

我通过启用查找中的正则表达式选项,使用 sublime 找到了这些字符 \xc0\xd0作为查询。我也设法 grep他们通过做grep $'\xc0' filename在 bash 中。

现在困扰我的是,如果我使用 -P grep 的选项, 它拒绝找到这些字符。

grep -P "\xc0" filename对于其中包含该字符的文件,不会打印出任何内容(上面的其他两种方法会成功找到它),这让我非常烦恼,我想知道为什么这行不通。

我读过其他几篇文章,其中 -P选项连同 "[\x80-\xff]"建议,但出于某种原因我无法让它们工作:\

grep -P很长一段时间以来一直是好 friend :(感谢任何帮助和提示!

我正在使用 GNU grep。

编辑:

我实际上已经尝试过 2 个 linux 发行版。

  • 在带有 bash 的 Ubuntu 14.04 上:我的终端似乎不喜欢这个字符:\

printf "\xc0"在终端中不打印任何内容,但是使用 > 将其打印到文件中然后在sublime中打开会显示角色。

printf "\xc0" > foo
grep $'\xc0' foo > out1
grep -P '\xc0' foo > out2
grep -P '\x{c0}' foo > out3

out{1,2,3}都是空的。

  • 在带有 bash 的 CentOS 7.2 上:printf打印一些东西——问号暗色的东西

printf "\xc0"打印出 �(实际上看起来像这样)

printf "\xc0" > foo
grep $'\xc0' foo > out1
grep -P '\xc0' foo > out2
grep -P '\x{c0}' foo > out3

只有 out1包含字符。

最佳答案

字节

您首先需要做的是在变量中创建您要搜索的确切字节

像这样的东西:

a=$(echo -e '\xc0)
a=$'\xc0'
a=$(printf '\xc0')
a=$(echo -e '\300') # 300 is 0xC0 in octal
a=$'\300'
a=$(printf '\300')
a=$(echo "c0" | xxd -r -p)

我可以尝试想出一些其他的方法,但我希望你明白这一点。

然后,您可以尝试使用 grep 搜索 byte:

echo $'Testing this: \xC0 byte' |  grep "$a"

而且,如果您使用带有 utf-8 的语言环境(这是最常见的),将会失败。如果您更改为 ISO-8859-1 语言环境,那将起作用:

LC_ALL=en_US.iso88591 echo $'Testing this: \xC0 byte' |
LC_ALL=en_US.iso88591 grep -P "$a"

或者,如果您不介意启动一个新的 bash 实例:

$ bash
$ export LC_ALL=en_US.iso88591
$ echo $'Testing this: \xC0 byte' | grep -P "$a"

然后通过执行 exit 返回到旧的 bash 环境。
这可能有效或无效,具体取决于您的系统。

让我们探索另一面:角色。

角色

您应该了解一个非常非常重要的转折点。
一个字节不是一个字符。好吧,有时候,纯粹是运气好。

但除了那些 128 个 ASCII 字符,其中一个字节是一个字符(不是 UTF-16 或 UTF-32。让我们也忘记 EBCDIC ),所有 1,114,112 (17 × 65,536) 个 UNICODE 代码点都超过一个字节 1

在这种情况下,您应该请求十六进制的 UNICODE 代码点 0xC0
在现代 bash 中,像这样:

$ printf '\U00C0`
À

这是this character: LATIN CAPITAL LETTER A WITH GRAVE

如果语言环境是 ISO-8859-1(至少是 ISO-8859-15),它将编码为一个字节,如果语言环境是 utf-8,则编码为两个字节。

$ a=$(printf '\UC0')
$ printf 'Testing \U00C0 character' | grep -P "$a"
Testing À character

如果您更改 LC_ALL 变量,它也会起作用。好吧,我的意思是 grep 会检测字符,但打印的行可能由于语言环境的改变而无法正确呈现字符。

如果文件有这个字符并且文件的编码是正确的。 Grep 将处理变量中字符的值。

关于regex - 如何使用十六进制表示来查找特殊字符(控制字符),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40811206/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com