2016-08-19 60 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