让我们采用字符串AaAa
。我想匹配 a
s:
$ 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
打印的内容。所以匹配如下:
- 开头的空字符串用于匹配
a
零次 - 第一个
a
- 第二个
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/