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" 不匹配......
你可以帮帮我吗?
提前致谢!
您将空字符(二进制值 0)与空字符串混淆了。
“行首的空字符串”只是该行第一个字符之前的非内容(存在)。行尾的空字符串,类似地,是在该行的最后一个字符之后找到的相似的非内容。空字符串可以被认为是由“空字符串,空字符串”组成,而具有某些内容的字符串可以被认为是“空字符串,Hello world,空字符串”。
C 中的字符串表示为一系列非 0 字节后跟一个或多个表示字符串终止的 0 字节,但这与正则表达式中的“空字符串”完全分开,并且在很大程度上是 C 中的内部选择编程语言和标准库。很少有其他语言这样做,但即使如此也可以表示空字符串。