grep"?"与有效匹配不匹配

时间:2016-08-24 17:10:38

标签: grep

我想匹配文件中的标签(带有可选括号)......很容易就会想到......正则表达式就像^\[?MyTag\]?。但是...... Grep并不喜欢它。没有任何有效匹配的行实际上是匹配的。

有趣的是:如果我用?替换*(所以零到无限的匹配,而不是零或一个),它匹配所有应该的东西,但实际上这意味着该特征被打破了,我不相信。

任何输入?

在Windows上使用grep(GNU grep)2.22。

PS:所以grep是这样的......

grep -e "^\[?MyTag\]?" file.txt

我的测试文件是这样的

[MyTag] hello
NotMyTag ugly
[NotMyTag] dumb
MyTag world

显然应该会显示第1行和第4行,但不显示任何内容。

2 个答案:

答案 0 :(得分:3)

首先,vanilla ?不支持grep,因此您需要使用-E标志来启用扩展正则表达式。您可以通过运行grep '?' <<< 'a'grep -E '?' <<< 'a'轻松验证这一点。只有后者才会匹配。 -e只是明确指出你的正则表达式是什么。它与-E不同。

如果将-e更改为大写,则初始命令可以正常工作:

grep -E '^\[?MyTag\]?'

示例:

$ grep -E '^\[?MyTag\]?' <<< '[MyTag] hello
> NotMyTag ugly
> [NotMyTag] dumb
> MyTag world'

输出:

[MyTag] hello
MyTag world

在SuperUser上获得this question的答案。

答案 1 :(得分:2)

?不是grep支持的基本正则表达式的一部分。 GNU grep支持它们作为扩展,但你必须逃避它们:

$ grep '^\[\?MyTag\]\?' file.txt
[MyTag] hello
MyTag world

或者,正如所指出的,使用grep -E来启用扩展正则表达式。

对于GNU grep,grepgrep -E之间的唯一区别,即使用基本和扩展正则表达式,是你必须逃避的,不是。

  • 基本正则表达式
    • 必须转义捕获组和量化:\( \)\{ \}
    • 零或一(?),一个或多个(+)和交替(|)不属于BRE,但受GNU grep支持作为扩展(但需要)要转义:\? \+ \|
  • 扩展正则表达式
    • 不必转义捕获组和量化:( ){ }
    • 支持
    • ?+|,不需要转义