为什么空匹配正则表达式在 sed 和 grep 中的工作方式不同?

Qua*_*tal 6 grep sed regular-expression

例如,使用 Debian 或 Debian 派生系统上的工具,像 之类的正则表达式N*可以匹配空字符串,可能会导致 sed 中的匹配:

$ echo 'Hello' | sed 's/N*/ xx&xx /g'
  xxxx H xxxx e xxxx l xxxx l xxxx o xxxx
Run Code Online (Sandbox Code Playgroud)

这是每个字符串字符之前的空匹配(因此是xxxx字符串,中间没有字符xx&xx)的正确结果(在 中 6 次Hello。尾随换行符不算在内,它不匹配)。

并且,如果任何字符(或字符组)匹配,它将出现在xx和之间xx

$ echo  'Hello' | sed 's/e*/ xx&xx /g'
 xxxx H xxexx l xxxx l xxxx o xxxx
Run Code Online (Sandbox Code Playgroud)

但是,grep 中的相同正则表达式不会匹配空字符串:

$ echo 'Hello' | grep -o 'N*'

Run Code Online (Sandbox Code Playgroud)

但只会打印非空匹配:

$ echo 'Hello' | grep -o 'e*'
e
Run Code Online (Sandbox Code Playgroud)

grep 中是否有额外的内部规则来避免empty正则表达式匹配?

Ste*_*itt 7

grep -o记录grep --help

  -o, --only-matching       show only nonempty parts of lines that match
Run Code Online (Sandbox Code Playgroud)

在手册中作为

仅打印匹配行的匹配(非空)部分,每个此类部分位于单独的输出行上。

所以是的,有一个额外的规则grep -o:只有匹配项非空时才会输出。

在 中echo 'Hello' | grep -o 'N*',正则表达式匹配(通过查看返回码可以看出,或者使用echo 'Hello' | grep 'N*'),但由于匹配为空,因此没有输出任何内容。