正則表示式用於處理文字,精通運用正則表示式可以有效的解決工作的效率
正則表示式有基礎正則表示式和擴充套件正則表示式區別
grep支援基礎的正則表示式,grep -E (egrep)支援擴充套件正則表示式
1、脫字元號(^)、美元符號($)
脫字元號和美元符號實質上匹配的是一個位置(即定位),分別錨定一行的行首(^)和一行的行尾($)
在這裡詳細說明一下理解正則表示式是習慣:
^hel
^鎖定一行的開始,接下來是字元h,緊接著是字元e,最後是字元l
只要滿足這個標準,至於小寫字母 L 之後是否存在字元就不在考慮範圍之內了,這樣理解正則表示式就很容易了
2、字元組 []
字元組匹配的是一組字元集合中的一個字元(必須匹配到一個字元)。(字元組巢狀使用變化多)
例: gr[ea]y 意思是:先找到字元g,接下來是字元r,緊接著是字元e或者a,最後是字元y,[]內含義是或者的意思
顯然,gr[ea]y 並不匹配gry,這是因為[ea]佔用一個位置字元,如果沒有gray或者grey,則命令反饋為空白
字元組中還包含兩個元字元:-(連字元)和^(排除符號)
-(連字元)在字元組[]中只有在兩個字元中間才是表示範圍的意思,例:<H[1-6]>,表示匹配<H 1>、<H 2> 、<H 3> 。。。。。
同時多重範圍也是允許的。[0-9A-F_!.?] 表示匹配一個數字、一個大寫字母、下劃線、感嘆號、點、問號,字元組內的順序無關緊要。
有人會問 ?字元(?)不是正則表示式,匹配前一個字元0個或者1個嗎?怎麼又是匹配?問號呢? 說明一下,字元組中符號-和^才是解釋為正則表示式,其他都是普通字元
注意在字元組中,-和^也不是一定就是解釋為正則表示式,位置很關鍵?如果-在[中括號後的第一個字元,那麼就表示普通字元-,如果^不是[中括號後的第一個字元,也不表示排除的意思
第一個-連字元是解釋為a到z的範圍,第二個-僅僅解釋為普通字元-,這樣就匹配到了字元h-lo
排除型字元組(^)
[^ ]取代[ ],^在字元組內的含義是排除的意思,例[^3-6] 表示排除數字3 、4、5、6之外的所有字元,不僅包含了1、2、7.。。。數字,大小寫字母,還包含了特殊字元.?!~等等
kal[^a] 匹配了kali,卻沒有匹配kal,這就是我之前說的字元組[]和[^]佔用一個匹配位,如果kal之後沒有字元是匹配情況的。
後面會結合字元組列舉一些技巧
3、句點符號(.)
表示用來匹配任意一個字元,空格也可以匹配
多選結構
4、字元 | 匹配任意子表示式
利用擴充套件正則表示式字元 | 可以篩選多個選項。例: “Bob|Robert”注意字元 | 兩邊沒有空格,表示包含Bob或Robert字串的行
多選結構的正則表示式字元 | 與字元組[]相似,字元 | 有或者的含義,同時字元組[]內的字元也有或者的含義,但是也有明顯的區別:字元組[]僅僅佔用一個字元位,而字元 | 兩邊卻是完整的正則表示式
一般| 都結合()一起來使用
()實際上是確定的多選的範圍,所以(a|e)與[ea]效果是一樣的,同時如果去除(),gre|ad 則表示包含gre或ad的行
三種表示式,反映的效果都是一樣,反斜槓用於遮蔽句點符號.
至於第三個表示式,嘗試用上面理解正則表示式的方式解讀一下:
(Fire|l)st\.[Ss]treet 首先查詢包含字串Fire或者L(小寫)接下來查詢Fire後面是否緊跟字元s和t(不是就排除),或者是L(小寫)後面是否是緊跟s和t,再接下來是句點,接著句點之 後是否是大寫s或者小寫s,大小寫s之後是treet
對於^(Geo|Je)ff(rey|ery) 表示開頭字元是Geo或者Je,拆開就是^Geo、 ^Je
如果是^Geoff|Jeff(rey|ery) 是表示什麼呢? 匹配一行開始是Geoff的行,或者包含字串Jeffery或Jeffery的行
5、單詞分界符\<和\> 有些egre不支援單詞分界符
\< 針對單詞,表示匹配單詞的開頭字元. \<the
\> 針對單詞,表示匹配單詞的結尾. the\>
與^$相似,只是^$針對行,\<和\>針對單詞,所以\<the\> 表示匹配單詞的開頭為the,結尾也是the,也就是匹配單詞the,所以是精準匹配單詞
END