Grep 格雷普&引用;不匹配有效的匹配项
我想匹配文件中的标记(可选括号)。。。容易的人会想。。。正则表达式类似于Grep 格雷普&引用;不匹配有效的匹配项,grep,Grep,我想匹配文件中的标记(可选括号)。。。容易的人会想。。。正则表达式类似于^\[?MyTag\]?。但是格雷普不喜欢它。所有有效匹配的行实际上都不匹配 有趣的是:如果我将?替换为*(因此零到无限匹配,而不是零或一),它会匹配所有它应该匹配的内容,但实际上这意味着该功能被破坏了,我不相信这一点 有什么意见吗 在Windows上使用grep(GNU grep)2.22 附言:所以格雷普是这样的 grep -e "^\[?MyTag\]?" file.txt 我的测试文件是这样的 [MyTag] he
^\[?MyTag\]?
。但是格雷普不喜欢它。所有有效匹配的行实际上都不匹配
有趣的是:如果我将?
替换为*
(因此零到无限匹配,而不是零或一),它会匹配所有它应该匹配的内容,但实际上这意味着该功能被破坏了,我不相信这一点
有什么意见吗
在Windows上使用grep(GNU grep)2.22
附言:所以格雷普是这样的
grep -e "^\[?MyTag\]?" file.txt
我的测试文件是这样的
[MyTag] hello
NotMyTag ugly
[NotMyTag] dumb
MyTag world
这显然会导致第1行和第4行显示,但不显示任何内容。首先,
?
在vanillagrep
中不受支持,因此您需要使用-E
标志来启用扩展正则表达式。您可以通过运行grep'?“来轻松验证这一点,首先,?
在vanillagrep
中不受支持,因此您需要使用-E
标志来启用扩展正则表达式。您可以通过运行grep'?“?
来轻松验证这一点,grep不支持基本正则表达式。GNU grep支持将它们作为扩展,但您必须避开它们:
$ grep '^\[\?MyTag\]\?' file.txt
[MyTag] hello
MyTag world
或者,如前所述,使用grep-E
启用扩展正则表达式
对于GNU grep来说,grep
和grep-E
之间的唯一区别,即使用基本正则表达式和扩展正则表达式,是必须转义和不必须转义的内容
- 基本正则表达式
- 捕获组和量化必须转义:
\(\)
和\{\}
- 零或一(
?
)、一或多(+
)和交替(
)不是BRE的一部分,但由GNU grep作为扩展支持(但需要转义:\?\+\\
)
- 扩展正则表达式
- 捕获组和量化不必转义:
()
和{}
?
、+
和|
受支持,不需要转义
?
不是grep支持的基本正则表达式的一部分。GNU grep支持将它们作为扩展,但您必须避开它们:
$ grep '^\[\?MyTag\]\?' file.txt
[MyTag] hello
MyTag world
或者,如前所述,使用grep-E
启用扩展正则表达式
对于GNU grep来说,grep
和grep-E
之间的唯一区别,即使用基本正则表达式和扩展正则表达式,是必须转义和不必须转义的内容
- 基本正则表达式
- 捕获组和量化必须转义:
\(\)
和\{\}
- 零或一(
?
)、一或多(+
)和交替(
)不是BRE的一部分,但由GNU grep作为扩展支持(但需要转义:\?\+\\
)
- 扩展正则表达式
- 捕获组和量化不必转义:
()
和{}
?
、+
和|
受支持,不需要转义
?只匹配一个字符,对吗?所以试试[xMyTag]。我怀疑会匹配。相关:@MadPhysicast我不-试着仔细阅读。@Almo正确,零或一匹配,所以[?Bla必须同时匹配Bla和[Bla,但不匹配[[Bla]。这正是正则表达式所做的,但显然grep不喜欢它。足够公平。正在研究解决方案。只匹配一个字符,对吗?所以尝试[xMyTag]。我怀疑会匹配。相关:@MadPhysicast我不-试着仔细阅读。@Almo正确,零或一个匹配,所以[?Bla必须同时匹配Bla和[Bla,但不匹配[[Bla.这正是正则表达式所做的,但显然grep不喜欢它。足够公平。致力于解决方案。Lol,#质量。还有#docquality-.-.-@FrankyBoy。我没有得到#质量参考。缺乏支持以及声称它在文档中有效。真的,几乎从未见过如此糟糕的文档记录。我已经定义了最初,我看到它被用作一个例子,说明如何不编写手册页,尽管后来的一些linux版本要好一些。不知道为什么你选择了我的答案而不是@BenjaminW.s tho。他的答案显然更好,特别是因为你使用的是GNU grep。啊,这又被取消了选择…愚蠢的stackoverflow…两个好答案,我选择了一个;)哈哈,#quality。也有#docquality-.-@FrankyBoy。我没有得到#quality的参考。缺乏支持以及声称它在文档中有效。真的,几乎从来没有见过如此糟糕的文档记录。我肯定看到它被用作如何不编写手册页的示例,尽管一些较新的linux版本有点b更好。不知道你为什么选择我的答案而不是@BenjaminW的答案。他的答案显然更好,特别是因为你使用GNU grep。啊,那又被取消了选择…愚蠢的stackoverflow…两个好答案,我必须选择一个;)啊,这是一个很好的回答(关于逃跑),谢谢:)-r
是递归模式,不是吗?啊,这实际上是一个很好的响应(关于转义),谢谢:)-r
是递归模式,不是吗?
[MyTag] hello
MyTag world
$ grep '^\[\?MyTag\]\?' file.txt
[MyTag] hello
MyTag world