2016-08-19 59 views
0

egrep在以下示例中并不匹配,并且来自我读过的所有内容都应该是。表达式是'{% +'我想要完成的是在我的降价文件中的所有{% %}括号中匹配。根据我目前的了解,它应该匹配{%,然后再匹配一个或多个空格,但如果没有空格,则匹配不匹配。我可以在PowerShell中使用相同的表达式,它匹配,所以我想知道我错过了什么。匹配egrep +量词不起作用

片段对

{% highlight ruby %} 
{% endhighlight %} 

cat file.md | egrep '{% +' 
+1

在这种情况下有'*'量词代替'+'量词。问题是什么? –

+0

*确实有效,但它也允许没有空间。我怎样才能确保空间的存在。我虽然那是+会做,但似乎没有工作。 – duffney

+0

尝试删除'+'并查看它是否有效。量词是多余的,因为您需要匹配1个或更多。如果有1,''{%''已经够了。此外,可能有一个标签,而不是空间。尝试'[[:blank:]]'而不是文字空间。 –

回答

1

对于我来说,你的正则表达式按预期工作。由于包含输入文件file.md

{% highlight ruby %} 
{% endhighlight %} 
not this line, though 
nor {%this%} 

当我运行命令的时间(避免UUoC),我得到所示的输出:

$ egrep '{% +' file.md 
{% highlight ruby %} 
{% endhighlight %} 
$ 

你没有确定你所使用的的egrep版本您正在使用它的平台。我正在运行Mac OS X 10.11.6并使用egrep (BSD grep) 2.5.1-FreeBSD(但我也得到了与GNU Grep 2.25相同的结果)。

但是,您应该知道{egrep的元字符,并且问题可能是它不像您期望的那样处理初始{

例如,这里是一个更复杂的egrep调用只应选择endhighlight行:

$ egrep '\{% {1,4}[a-z]{4,20} {1,4}%\}' file.md 
{% endhighlight %} 
$ 

我用反斜杠转义第一和最后一个括号。 {n,m}表示法n≤x≤m匹配前面的正则表达式(空白和[a-z])。您可以省略,m;您也可以使用{4,} - 查看手册以了解这些内容。但是,我的机器上,我还可以运行:

$ egrep '{% {1,4}[a-z]{4,20} {1,4}%}' file.md 
{% endhighlight %} 
$ 

据推测,这是因为第一{不启动{n,m}序列,它被视为一个普通的字符。

如果你看一下POSIX规范Extended Regular Expressions,你会发现,它说,使用{一样,是未定义的行为:

*+?{

<asterisk><plus-sign><question-mark><left-brace>应在括号表达式中使用时除外(请参阅RE括号表达式)。任何以下用途的产生不确定的结果:

  • 如果首先出现在一个ERE这些字符,或紧跟在<vertical-line><circumflex>,或<left-parenthesis>

  • 如果<left-brace>是不是一个有效间隔的部分表达式(见ERES匹配多个字符)

因此,根据POSIX,您使用正则表达式是p导致未定义的结果。因此,你会得到POSIX认为可以接受的结果。

显然,你应该能够使用以下并得到期望的结果:

$ egrep '\{% +' file.md 
{% highlight ruby %} 
{% endhighlight %} 
$ 
+0

通过使用{和}上的转义“\”字符,我能够使+量词符合我的预期。我感谢你指出它也是一个元字符。现在它完全有道理,为什么它以前没有工作。我也非常感谢长期和详细的评论。这非常有用,谢谢。 – duffney