對於我來說,你的正則表達式按預期工作。由於包含輸入文件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:]]'而不是文字空間。 –