Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Grep 格雷普&引用;不匹配有效的匹配项_Grep - Fatal编程技术网

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行显示,但不显示任何内容。

首先,
在vanilla
grep
中不受支持,因此您需要使用
-E
标志来启用扩展正则表达式。您可以通过运行
grep'?“来轻松验证这一点,首先,
在vanilla
grep
中不受支持,因此您需要使用
-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