2016-08-24 151 views
1

我想匹配文件中的標籤(帶有可選的括號)...容易的人會認爲...正則表達式類似於^\[?MyTag\]?。但是... Grep不喜歡它。實際上沒有匹配的有效匹配行。grep「?」不匹配有效匹配

有趣的部分是:如果我更換?*(所以零到無窮大的比賽,而不是零或一)它匹配像它應該,但實際上這將意味着該功能壞了,我不知道一切相信。

任何輸入?

在Windows上使用grep(GNU grep)2.22。

PS:這樣的grep是這樣的...

grep -e "^\[?MyTag\]?" file.txt 

和我的測試文件是這樣的

[MyTag] hello 
NotMyTag ugly 
[NotMyTag] dumb 
MyTag world 

,顯然不應該導致第1和第4行顯示,但說明不了什麼。

+0

?只匹配一個字符,對嗎?所以試試[xMyTag]。我懷疑這會匹配。 – Almo

+0

相關:http://superuser.com/a/23199/297512 –

+0

@MadPhysicist我不會 - 嘗試仔細閱讀。 – FrankyBoy

回答

2

?不是grep支持的基本正則表達式的一部分。 GNU的grep支持它們作爲一個擴展,但你必須轉義:

$ grep '^\[\?MyTag\]\?' file.txt 
[MyTag] hello 
MyTag world 

或者,正如指出的那樣,使用grep -E啓用擴展正則表達式。

對於GNU grep,grepgrep -E之間唯一的區別,即使用基本的和擴展的正則表達式,就是你必須逃避的和不能的。

  • 基本的正則表達式
    • 捕獲組和量化需要被轉義:\(\)\{ \}
    • 零個或一個(?),一個或多個(+)和交替(|)不是一部分的BRE,但支持GNU grep作爲擴展(但需要轉義:\? \+ \|
  • Extende d正則表達式
    • 捕獲組和量化不必進行轉義:(){ }
    • ?+|支持,並且不需要進行轉義
+0

啊,這是一個很好的迴應(關於轉義),謝謝:) – FrankyBoy

+0

'-r'是遞歸模式,不是嗎? –

+1

@MadPhysicist等等,是的!在這裏混合sed ... –

3

首先,?不支持香草grep,所以你需要使用-E標誌來啓用擴展正則表達式。您可以通過運行grep '?' <<< 'a'grep -E '?' <<< 'a'來輕鬆進行驗證。只有後者纔會匹配。 -e只是明確指出你的正則表達式是什麼。它與-E不一樣。如果你改變了-e爲大寫

您最初的命令正常工作:

grep -E '^\[?MyTag\]?' 

例子:

$ grep -E '^\[?MyTag\]?' <<< '[MyTag] hello 
> NotMyTag ugly 
> [NotMyTag] dumb 
> MyTag world' 

輸出:

[MyTag] hello 
MyTag world 

幸得的this question答案超級用戶。

+0

哈哈,#品質。另外[文檔聲稱它](https://www.gnu.org/software/grep/manual/grep.html)也#docquality -.- – FrankyBoy

+0

@FrankyBoy。我沒有收到#質量參考。 –

+0

既缺乏支持,也聲稱它在文檔中起作用。真的,幾乎沒有看到如此嚴重的文件記錄這樣一個必不可少的工具。 – FrankyBoy