regex - grep/egrep 星号运算符不匹配所有出现的情况

标签 regex linux macos bash grep

让我们采用字符串AaAa。我想匹配 as:

$ echo AaAa | grep -o a
a
a

因此它会打印每场比赛,而不仅仅是第一个比赛。当我在 a 之后添加一个星号时,我得到以下内容

$ echo AaAa | grep -o 'a*'
$

为什么 grep 这次没有输出所有匹配项?我知道它匹配,因为如果我们删除 -o 选项,它会打印整行:

$ echo AaAa | grep 'a*'
AaAa

为了查看它应该匹配多少个匹配项,我使用了 sed:

$ echo AaAa | sed 's/a*/x/g'
xAxAx

替换x的字符串应该是grep -o打印的内容。所以匹配如下:

  1. 开头的空字符串用于匹配 a 零次
  2. 第一个a
  3. 第二个a

为什么不打印以下内容?

$ echo AaAa | grep -o 'a*'

a
a
$

编辑

以上是使用 GNU grep 2.5.1 完成的 以下是使用 GNU grep 2.6.3 完成的

$ echo AaAa | grep -o 'a*'
a
a
$

请注意,它仍然没有在自己的行上打印第一个空字符串。看来这个错误在这个新版本中已部分修复。难道不应该有一个空字符串匹配吗,就像上面的 sed 示例一样?

最佳答案

让我们从这里开始:

$ echo AaAa | grep -o 'a*'
$

您提到这是在 2.5.1 版本上运行的。这似乎是 grep 中的一个错误,似乎已在 2.5.3 中修复。

这里引用 GNU grep development :

2.5.3
=====
Fix the combinations:
 * -i -o
 * --colour -i
 * -o -b
 * -o and zero-width matches
Go through the bug list im my mailbox and fix fixable.
Fix bugs reported with 2.5.2.

-o 和零宽度匹配是我们在这里处理的错误。零宽度断言不会消耗字符串中的字符来进行匹配,但它们仍然是断言,因此它们必须匹配。在本例中,我们的零宽度断言与字符 a 匹配零次。

进入下一部分:

$ echo AaAa | grep -o 'a*'
a
a
$

我认为您在这里没有得到空行的原因只是 -o 标志不打印任何零宽度断言。

关于regex - grep/egrep 星号运算符不匹配所有出现的情况,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24834924/

相关文章:

javascript - Express 4 中路径参数中的 Json 类对象

regex - perl regex - 多种模式匹配,可选匹配

linux - 如何从另一个文件A中删除文件B上出现的行?

macos - mach 内核,锁的最佳使用

java - 无法在 mac 终端中设置类路径

iphone - 保留 IBOutlet 数量

regex - 正则表达式以元音匹配单词的开头和结尾

python - 艰难地学习 Python,练习 35 : placing a regular expression

linux - RedLevel1 和无法打开共享对象文件 : No such file or directory

c 程序作为后台运行进程并且永不死机?