如何查找特殊字符 NUL (^@^@^@)

如何查找特殊字符 NUL (^@^@^@)

文件:

O000000667520994000000074720121112000000N^@^@^@ 

我使用了以下命令,但它不起作用。

grep "^@^@^@" *

答案1

您可以在 perl-regexp 模式 (-P) 下通过十六进制代码 grep 任何字符,包括控制/不可打印字符:

grep -Pa '\x00' ...

答案2

^@不是插入符号^和 at 符号@,而是一个字符。这是某些程序显示 NUL 字符(ASCII 值 0,\0在 C 中也称为)的方式。

在这里我创建了一个包含 NUL 字节的文件。请注意,我用它cat -v来显示非打印字符。

$ cat -v blah
hello
null^@
hi
$ hexdump -C blah
00000000  68 65 6c 6c 6f 0a 6e 75  6c 6c 00 0a 68 69 0a     |hello.null..hi.|
0000000f

Grep 很难找到 NUL,因为它们在 C 中被用来终止字符串。但是,Sed 可以完成这项工作:

$ sed -n '/\x0/p' blah
null
$ sed -n '/\x0/p' blah | cat -v
null^@

在 vi​​ 中,在插入模式下按Ctrl- V, Ctrl- Shift-@插入空字节。

答案3

如果grep -P不起作用(例如在 OS X 上),请尝试以下操作:

grep -E '\x00' ...

答案4

字符 ^@ 是 NUL 字符,因此恐怕无法直接对其进行 grep。

最好的选择可能是编写一个搜索该字节序列的简单程序。

或者,您可以尝试将其转换为某种形式的十六进制转储(odxxd或类似),然后对其输出进行 grep。但坦率地说,要做到这一点会很棘手。

相关内容