什么是真正的空字符串?

seb*_*elk 2 linux bash grep regex command-line

我相信我们大多数人都知道,当我们希望某些正则表达式与行首的字符串匹配时,我们必须使用“^”...

但是,我试图理解“行首为空字符串”的真正含义

我知道 echo "Hello World" | grep ^H 它匹配

所以请看一下这些命令的输出:

[sergio@localhost ~]$ dd if=/dev/zero of=/tmp/texto  count=1 bs=1 2>/dev/null
[sergio@localhost ~]$ od -ta /tmp/texto          
0000000 nul
0000001
Run Code Online (Sandbox Code Playgroud)

到目前为止一切都如预期,所以:

[sergio@localhost ~]$ echo  "Hello" >> /tmp/texto
[sergio@localhost ~]$ grep -a "^Hello" /tmp/texto 
Run Code Online (Sandbox Code Playgroud)

好吧,我必须承认的第一件事没有预料到,在 Hello 之前有一个空字符,为什么它不匹配?

好的,让我们以 perl 风格使用 grep:

[sergio@localhost ~]$ grep -a -P "\x00Hello" /tmp/texto 
Hello
Run Code Online (Sandbox Code Playgroud)

好的,它匹配

但是我不明白(也许我有一些误解)为什么 grep -a "^Hello" 不匹配......

你可以帮帮我吗?

提前致谢!

use*_*ser 5

您将空字符(二进制值 0)与空字符串混淆了。

“行首的空字符串”只是该行第一个字符之前的非内容(存在)。行尾的空字符串,类似地,是在该行的最后一个字符之后找到的相似的非内容。空字符串可以被认为是由“空字符串,空字符串”组成,而具有某些内容的字符串可以被认为是“空字符串,Hello world,空字符串”。

C 中的字符串表示为一系列非 0 字节后跟一个或多个表示字符串终止的 0 字节,但这与正则表达式中的“空字符串”完全分开,并且在很大程度上是 C 中的内部选择编程语言和标准库。很少有其他语言这样做,但即使如此也可以表示空字符串。