2015-10-23 35 views
4
$ cat file 
anna 
amma 
kklks 
ksklaii 

$ grep '\`' file 
anna 
amma 
kklks 
ksklaii 

爲什麼?這場比賽如何運作?grep正則表達式反向匹配所有行

+0

請注意,MacOS'grep'做你認爲它應該; GNU會顯示這種行爲。還要注意,放下反斜槓將使其工作。所以當一個反引號被轉義出來時,在GNU'grep'中發生了一些奇怪的事情(AFAIK應該相當於簡單的反引號,但不是)。 – Amadan

+0

另請注意,添加'-P'選項(使用PCRE引擎)將使其行爲。所以我傾向於認爲這是GNU'grep'解析正則表達式的錯誤。 – Amadan

回答

2

twm's answer提供了重要指針,但要注意,它是序列\`而不是`本身充當GNU正則表達式中的輸入起始點

因此,以匹配指定爲單引號shell字符串正則表達式文字反引號,你並不需要在所有任何逃避,也沒有用GNU grep,也不符合BSD/MacOS的grep

$ { echo 'ab'; echo 'c`d'; } | grep '`' 
c`d 

當使用雙引號貝殼串 - 你應該避免爲正則表達式,原因ŧ帽子將成爲顯而易見的 - 事情變得更加複雜,因爲你那麼必須逃脫`外殼的緣故,以便通過爲文字將它傳遞給grep

$ { echo 'ab'; echo 'c`d'; } | grep "\`" 
c`d 

需要注意的是,外殼已解析後"..."字符串,grep仍然只看到`

要重新創建一個雙引號字符串的原始命令與GNU grep

$ { echo 'ab'; echo 'c`d'; } | grep "\\\`" # !! BOTH \ and ` need \-escaping 
ab 
c`d 

此外,殼的字符串解析後,grep看到剛剛\`,這在GNU grep是啓動的所有輸入行匹配。

  • 還要注意,由於由線grep處理輸入線,\`具有如^相同的效果錨開始-α-的-;與多行輸入,但是 - 如果您使用grep -z一次讀取所有行 - \`只匹配整個字符串的最開始。

要BSD/MACOS grep\`簡單地逸出字面`,所以它僅匹配包含一個輸入線路。

6

這似乎是正則表達式的GNU擴展。反引號('\`')錨匹配主題字符串的開頭,這就解釋了爲什麼它匹配所有行。 OS X顯然沒有實現GNU擴展,這可以解釋爲什麼你的例子不符合那裏的任何一行。見http://www.regular-expressions.info/gnu.html

如果您希望在GNU擴展實際上是相匹配的實際反引號,這對我的作品:

grep '[`]' file