2016-08-24 104 views
1

我想匹配文件中的标签(带有可选的括号)...容易的人会认为...正则表达式类似于^\[?MyTag\]?。但是... Grep不喜欢它。实际上没有匹配的有效匹配行。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

?只匹配一个字符,对吗?所以试试[xMyTag]。我怀疑这会匹配。 – Almo

+0

相关:http://superuser.com/a/23199/297512 –

+0

@MadPhysicist我不会 - 尝试仔细阅读。 – FrankyBoy

回答

2

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

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

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

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

  • 基本的正则表达式
    • 捕获组和量化需要被转义:\(\)\{ \}
    • 零个或一个(?),一个或多个(+)和交替(|)不是一部分的BRE,但支持GNU grep作为扩展(但需要转义:\? \+ \|
  • Extende d正则表达式
    • 捕获组和量化不必进行转义:(){ }
    • ?+|支持,并且不需要进行转义
+0

啊,这是一个很好的回应(关于转义),谢谢:) – FrankyBoy

+0

'-r'是递归模式,不是吗? –

+1

@MadPhysicist等等,是的!在这里混合sed ... –

3

首先,?不支持香草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 

幸得的this question答案超级用户。

+0

哈哈,#品质。另外[文档声称它](https://www.gnu.org/software/grep/manual/grep.html)也#docquality -.- – FrankyBoy

+0

@FrankyBoy。我没有收到#质量参考。 –

+0

既缺乏支持,也声称它在文档中起作用。真的,几乎没有看到如此严重的文件记录这样一个必不可少的工具。 – FrankyBoy