对于我来说,你的正则表达式按预期工作。由于包含输入文件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括号表达式)。任何以下用途的产生不确定的结果:
因此,根据POSIX,您使用正则表达式是p导致未定义的结果。因此,你会得到POSIX认为可以接受的结果。
显然,你应该能够使用以下并得到期望的结果:
$ egrep '\{% +' file.md
{% highlight ruby %}
{% endhighlight %}
$
在这种情况下有'*'量词代替'+'量词。问题是什么? –
*确实有效,但它也允许没有空间。我怎样才能确保空间的存在。我虽然那是+会做,但似乎没有工作。 – duffney
尝试删除'+'并查看它是否有效。量词是多余的,因为您需要匹配1个或更多。如果有1,''{%''已经够了。此外,可能有一个标签,而不是空间。尝试'[[:blank:]]'而不是文字空间。 –