我想匹配文件中的标签(带有可选括号)......很容易就会想到......正则表达式就像^\[?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行,但不显示任何内容。
答案 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,grep
和grep -E
之间的唯一区别,即使用基本和扩展正则表达式,是你必须逃避的,不是。
\( \)
和\{ \}
?
),一个或多个(+
)和交替(|
)不属于BRE,但受GNU grep支持作为扩展(但需要)要转义:\? \+ \|
)( )
和{ }
?
,+
和|
,不需要转义