Unix支持兩種的正則表達式的版本:
(1)現代版本:擴展正則表達式(extended regular expression,ERE),屬於IEEE1003.2標準,擁有比BRE更多的功能。
(2)廢棄版本:基本正則表達式(basic regular expression,BRE),它是多年之前使用的更原始類型的正則表達式,功能弱且語法容易混淆,後來被1003.2標準取代,保留它們只是爲了與舊程序兼容。
ERE和BRE之間的主要區別:對於BRE來講,有一些特定的元字符不能使用,而其餘元字符必須使用反斜線引用。不能使用的元字符有問號、加號和豎線
? + |
必須轉義的元字符有花括號和圓括號
{ } ( )
基本正則表達式的限制:
Ø 花括號必須使用反斜線引用,如\{\}
Ø 圓括號必須使用反斜線引用,如\(\)
Ø 不能使用?,可是可使用\{0,1\}模擬
Ø 不能使用+,可是可使用\{1,\}模擬
Ø 不能使用|(豎線)
Ø 不能使用預字義字符類
1. 全部的普通字符,例如字母和數字都與自身匹配,如shell匹配於shell;WoRd匹配於WoRd,但不匹配於word
2. 當咱們須要表示meta字符自己時,能夠轉義它,即前面放一個反斜槓。例如
\* 匹配字面上的*
\\ 匹配字面上的\
3. 在方括號表達式中,全部其餘的的meta字符都會失去其特殊含義,例如
[ .\*]匹配於句點、反斜槓及星號。
4. 爲了擴展正則表達式的功能,可使用錨指定查找模式的位置。如$元字符是一個匹配行末尾的錨。爲了搜索以「xiao「結尾的行,可使用:
grep ‘xiao$’ data
經過使用這^ $這兩個錨,可是兩個錨之間不指定任何內容何以方便地查找空行。
grep ‘^$ ’ data | wc -l
匹配包含一個字符的行
grep ‘^.$’ data
注意:^與$僅在BRE的起始與結尾下有特殊用途。
查找全部包含字符串」kn」的行,可是字符串kn只能出如今單詞的開頭
grep ‘\<kn’ data
爲了搜索完整的單詞,可吧同時使用\<和\>
grep ‘\<word\> data
爲了方便起見,在使用GNU實用工具的系統上,如Linux和FreeBSD系統,可使用\b(boundary marker ,邊界標記)做爲\<和\>的替代,
grep ‘\<word\> data = grep ‘\bword\b’ data
如下由高至低列出了ERE運算符的優先級:
運算符
|
含義
|
[ . . ] [ = =] [ : : ]
|
用於字符對應的方括號符號
|
\metacharacter
|
轉義的元字符
|
[ ]
|
方括號表達式
|
( )
|
分組
|
+ * ? { }
|
重複前置的正則表達式
|
無符號(no symbol)
|
連續字符
|
^ $
|
錨點
|
|
|
交替
|
運算符
|
含義
|
\w
|
匹配任何單詞組成字符,等同於[[:alnum:]]
|
\W
|
匹配任何非單詞組成字符,等同於[^[:alnum:]]
|
\< \>
|
匹配單詞的起始與結尾
|
\b
|
匹配單詞的起始或結尾處所找到的空字符串。注意:因爲awk使用\b表示後退字符,所以GNU awk(gawk)使用\y表示此功能
|
\B
|
匹配兩個單詞組成字符之間的空字符串
|
|
|
在正則表達式中,元字符.(點號)匹配任何單個的字符,新行字符除外(在Unix中,新行字符標記一行的末尾)
例:grep ‘xiao..y’ data
在data文件中查找全部包含下述模式的行:字符串xiao後跟兩個任意字符,再後跟一個字母y
字符類:將字符放在方括號[]中指定但願搜索的字符。這樣的結構就稱爲一個字符類。
grep ‘\\\*.*[A-Za-z]+\$’ data
查找全部包含字符「\*」,後面跟任意數量的字符,再後跟1 個或多個字母,最後跟一個「$」的行。
怎樣理解複雜的正規表達式
當遇到難以理解的正則表達式時,將它寫在一張紙上,而後將正則表達式分紅不一樣部分,縱向書寫不一樣部分,一個在另外一個之上。依次取不一樣部分,並將各部分的含義寫在同一行上。
咱們將這個正則表達式分隔成:
\\ _____ 1個\(反斜線)字符
\* —— 1個*(星號)字符
.* ____ 任意數量的其餘字符
[A-Za-z] ____ 1 個或多個大寫字母或小寫字母
\$ ____ 1個$(美圓)字符
示範文件:Linux中的字典文件/usr/share/dict/words
(1)哪些英語單詞以「qu」開頭並以y結尾呢?
grep ‘^yu[a-z]+y$’ /usr/share/dict/words
grep '^qu.*y$' /usr/share/dict/words^ 行的開頭
egrep '^yu[a-z]+y$' /usr/share/dict/words
qu 字符串qu
[a-z]+ 1個或多個小寫字母
y 字母y
$ 行的結尾
(2)查找一個包含全部5個元間字母a、e、i、o、u(而且以該順序出現)的普通英語單詞。
這5個字母沒必要連在一塊兒,可是它們必須按字母表順序出現
grep 'a[a-z]*e[a-z]*i[a-z]*o[a-z]*u' /usr/share/dict/words
(3)在/bin目錄中查找包含兩個字母長的命令
ls /bin | egrep '^[a-z]{2}$'
ls /bin | grep '^[a-z][a-z]$'
注:在一些系統上,grep並不會返回預想的結果,由於它不能將括號識別爲花括號元字符,若是出現這種狀況,可使用egrep 代替grep