大有可爲的「正則表達式」(二)

5.3.  基本和擴展正則表達式

Unix支持兩種的正則表達式的版本: 正則表達式

1)現代版本:擴展正則表達式(extended regular expressionERE),屬於IEEE1003.2標準,擁有比BRE更多的功能。 shell

2)廢棄版本:基本正則表達式(basic regular expressionBRE),它是多年之前使用的更原始類型的正則表達式,功能弱且語法容易混淆,後來被1003.2標準取代,保留它們只是爲了與舊程序兼容。 express

EREBRE之間的主要區別:對於BRE來講,有一些特定的元字符不能使用,而其餘元字符必須使用反斜線引用。不能使用的元字符有問號、加號和豎線 ide

    +      | 工具

必須轉義的元字符有花括號和圓括號 spa

{  }    (  ) orm

基本正則表達式的限制: ci

Ø  花括號必須使用反斜線引用,如\{\} 字符串

Ø  圓括號必須使用反斜線引用,如\(\) it

Ø  不能使用?,可是可使用\{0,1\}模擬

Ø  不能使用+,可是可使用\{1\}模擬

Ø  不能使用|(豎線)

Ø  不能使用預字義字符類

 

5.4.  正則表達式的基本規則

1. 全部的普通字符,例如字母和數字都與自身匹配,如shell匹配於shellWoRd匹配於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實用工具的系統上,如LinuxFreeBSD系統,可使用\bboundary marker ,邊界標記)做爲\<\>的替代,

grep  ‘\<word\>   data  =  grep  ‘\bword\b’   data

5.5.  ERE運算符的優先級

如下由高至低列出了ERE運算符的優先級:

運算符

含義

[ . . ] [ = =] [ : : ]

用於字符對應的方括號符號

\metacharacter

轉義的元字符

[ ]

方括號表達式

分組

+  *  ?  { }

重複前置的正則表達式

無符號(no symbol

連續字符

^  $

錨點

|

交替

 

5.6.  額外的正則表達式運算符

運算符

含義

\w

匹配任何單詞組成字符,等同於[[:alnum:]]

\W

匹配任何非單詞組成字符,等同於[^:alnum:]]

\< \>

匹配單詞的起始與結尾

\b

匹配單詞的起始或結尾處所找到的空字符串。注意:因爲awk使用\b表示後退字符,所以GNU awkgawk)使用\y表示此功能

\B

匹配兩個單詞組成字符之間的空字符串

 

 

 

5.6.  匹配字符:字符類

在正則表達式中,元字符.(點號)匹配任何單個的字符,新行字符除外(在Unix中,新行字符標記一行的末尾)

例:grep   ‘xiao..y’  data

data文件中查找全部包含下述模式的行:字符串xiao後跟兩個任意字符,再後跟一個字母y

字符類:將字符放在方括號[]中指定但願搜索的字符。這樣的結構就稱爲一個字符類。

 

grep  ‘\\\*.*[A-Za-z]+\$’ data

查找全部包含字符「\*」,後面跟任意數量的字符,再後跟1 個或多個字母,最後跟一個「$」的行。

怎樣理解複雜的正規表達式

當遇到難以理解的正則表達式時,將它寫在一張紙上,而後將正則表達式分紅不一樣部分,縱向書寫不一樣部分,一個在另外一個之上。依次取不一樣部分,並將各部分的含義寫在同一行上。

咱們將這個正則表達式分隔成:

\\    _____  1\(反斜線)字符

\*    ——   1*(星號)字符

.*    ____   任意數量的其餘字符

[A-Za-z]  ____  1 個或多個大寫字母或小寫字母

\$    ____   1$(美圓)字符

 

5.7.  正規表達式案例

示範文件: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個元間字母aeiou(而且以該順序出現)的普通英語單詞。

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

相關文章
相關標籤/搜索