天天看點

linux shell 正規表達式(BREs,EREs,PREs)差異比較(轉)

add by zhj:

Python的正規表達式跟Perl很像,Python的re子產品文檔中也說"This module provides regular expression matching operations similar to those found in Perl."

grep -P 就是使用Perl正規表達式,由于工作中使用的是Python,我自己在使用grep時,加-P參數,這樣也友善

原文:http://www.cnblogs.com/chengmo/archive/2010/10/10/1847287.html

正規表達式:在計算機科學中,是指一個用來描述或者比對一系列符合某個句法規則的字元串的單個字元串。在很多文本編輯器或其他工具裡,正規表達式通常被用來檢索和/或替換那些符合某個模式的文本内容。許多程式設計語言都支援利用正規表達式進行字元串操作。例如,在Perl中就内建了一個功能強大的正規表達式引擎。正規表達式這個概念最初是由Unix中的工具軟體(例如sed和grep)普及開的。正規表達式通常縮寫成“regex”,單數有regexp、regex,複數有regexps、regexes、regexen。這些是正規表達式的定義。 由于起源于unix系統,是以很多文法規則一樣的。但是随着逐漸發展,後來擴充出以下幾個類型。了解這些對于學習正規表達式。

一、正規表達式分類:

1、基本的正規表達式(Basic Regular Expression 又叫 Basic RegEx  簡稱 BREs)

2、擴充的正規表達式(Extended Regular Expression 又叫 Extended RegEx 簡稱 EREs)

3、Perl 的正規表達式(Perl Regular Expression 又叫 Perl RegEx 簡稱 PREs)

說明:隻有掌握了正規表達式,才能全面地掌握 Linux 下的常用文本工具(例如:grep、egrep、GUN sed、 Awk 等) 的用法

二、Linux 中常用文本工具與正規表達式的關系 

常握 Linux 下幾種常用文本工具的特點,對于我們更好的使用正規表達式是很有幫助的

  • grep , egrep 正規表達式特點:

1)grep 支援:BREs、EREs、PREs 正規表達式

grep 指令後不跟任何參數,則表示要使用 ”BREs“ 

grep 指令後跟 ”-E" 參數,則表示要使用 “EREs“

grep 指令後跟 “-P" 參數,則表示要使用 “PREs"

2)egrep 支援:EREs、PREs 正規表達式

egrep 指令後不跟任何參數,則表示要使用 “EREs”

egrep 指令後跟 “-P" 參數,則表示要使用 “PREs"

3)grep 與 egrep 正則比對檔案,處理檔案方法

a. grep 與 egrep 的處理對象:文本檔案

b. grep 與 egrep 的處理過程:查找文本檔案中是否含要查找的 “關鍵字”(關鍵字可以是正規表達式) ,如果含有要查找的 ”關健字“,那麼預設傳回該文本檔案中包含該”關健字“的該行的内容,并在标準輸出中顯示出來,除非使用了“>" 重定向符号,

c. grep 與 egrep 在處理文本檔案時,是按行處理的

  • sed 正規表達式特點

1)sed 文本工具支援:BREs、EREs

sed 指令預設是使用"BREs"

sed 指令參數 “-r ” ,則表示要使用“EREs"

2)sed 功能與作用

a. sed 處理的對象:文本檔案

b. sed 處理操作:對文本檔案的内容進行 --- 查找、替換、删除、增加等操作

c. sed 在處理文本檔案的時候,也是按行處理的

  • Awk(gawk)正規表達式特點

1)Awk 文本工具支援:EREs

awk 指令預設是使用 “EREs"

2)Awk 文本工具處理文本的特點

a. awk 處理的對象:文本檔案

b. awk 處理操作:主要是對列進行操作

三、常見3中類型正規表達式比較

字元 說明 Basic RegEx Extended RegEx python RegEx Perl regEx
轉義 \
^ 比對行首,例如'^dog'比對以字元串dog開頭的行(注意:awk 指令中,'^'則是比對字元串的開始)
$ 比對行尾,例如:'^、dog$'比對以字元串 dog 為結尾的行(注意:awk 指令中,'$'則是比對字元串的結尾)
^$ 比對空行
^string$ 比對行,例如:'^dog$'比對隻含一個字元串 dog 的行
\< 比對單詞,例如:'\<frog' (等價于'\bfrog'),比對以 frog 開頭的單詞 不支援 不支援(但可以使用\b來比對單詞,例如:'\bfrog')
\> 比對單詞,例如:'frog\>'(等價于'frog\b '),比對以 frog 結尾的單詞 不支援(但可以使用\b來比對單詞,例如:'frog\b')
\<x\> 比對一個單詞或者一個特定字元,例如:'\<frog\>'(等價于'\bfrog\b')、'\<G\>' 不支援(但可以使用\b來比對單詞,例如:'\bfrog\b'
() 比對表達式,例如:不支援'(frog)' 不支援(但可以使用\(\),如:\(dog\)
\(\) 不支援(同())
比對前面的子表達式 0 次或 1 次(等價于{0,1}),例如:where(is)?能比對"where" 以及"whereis" 不支援(同\?)
\? 比對前面的子表達式 0 次或 1 次(等價于'\{0,1\}'),例如:'where\(is\)\? '能比對 "where"以及"whereis" 不支援(同?)
? 當該字元緊跟在任何一個其他限制符(*, +, ?, {n},{n,}, {n,m}) 後面時,比對模式是非貪婪的。非貪婪模式盡可能少的比對所搜尋的字元串,而預設的貪婪模式則盡可能多的比對所搜尋的字元串。例如,對于字元串 "oooo",'o+?' 将比對單個"o",而 'o+' 将比對所有 'o'
. 比對除換行符('\n')之外的任意單個字元(注意:awk 指令中的句點能比對換行符) .(如果要比對包括“\n”在内的任何一個字元,請使用:'(^$)|(.) .(如果要比對包括“\n”在内的任何一個字元,請使用:' [.\n] '
* 比對前面的子表達式 0 次或多次(等價于{0, }),例如:zo* 能比對 "z"以及 "zoo"
\+ 比對前面的子表達式 1 次或多次(等價于'\{1, \}'),例如:'where\(is\)\+ '能比對 "whereis"以及"whereisis" 不支援(同+)
+ 比對前面的子表達式 1 次或多次(等價于{1, }),例如:zo+能比對 "zo"以及 "zoo",但不能比對 "z" 不支援(同\+)
{n} n 必須是一個 0 或者正整數,比對子表達式 n 次,例如:zo{2}能比對 不支援(同\{n\})
{n,} "zooz",但不能比對 "Bob"n 必須是一個 0 或者正整數,比對子表達式大于等于 n次,例如:go{2,} 不支援(同\{n,\})
{n,m} 能比對 "good",但不能比對 godm 和 n 均為非負整數,其中 n <= m,最少比對 n 次且最多比對 m 次 ,例如:o{1,3}将配"fooooood" 中的前三個 o(請注意在逗号和兩個數之間不能有空格) 不支援(同\{n,m\})
x|y 比對 x 或 y,例如: 不支援'z|(food)' 能比對 "z" 或"food";'(z|f)ood' 則比對"zood" 或 "food" 不支援(同x\|y)
[0-9] 比對從 0 到 9 中的任意一個數字字元(注意:要寫成遞增)
[xyz] 字元集合,比對所包含的任意一個字元,例如:'[abc]'可以比對"lay" 中的 'a'(注意:如果元字元,例如:. *等,它們被放在[ ]中,那麼它們将變成一個普通字元)
[^xyz] 負值字元集合,比對未包含的任意一個字元(注意:不包括換行符),例如:'[^abc]' 可以比對 "Lay" 中的'L'(注意:[^xyz]在awk 指令中則是比對未包含的任意一個字元+換行符)
[A-Za-z] 比對大寫字母或者小寫字母中的任意一個字元(注意:要寫成遞增)
[^A-Za-z] 比對除了大寫與小寫字母之外的任意一個字元(注意:寫成遞增)
\d 比對從 0 到 9 中的任意一個數字字元(等價于 [0-9])
\D 比對非數字字元(等價于 [^0-9])
\S 比對任何非空白字元(等價于[^\f\n\r\t\v])
\s 比對任何空白字元,包括空格、制表符、換頁符等等(等價于[ \f\n\r\t\v])
\W 比對任何非單詞字元 (等價于[^A-Za-z0-9_])
\w 比對包括下劃線的任何單詞字元(等價于[A-Za-z0-9_])
\B 比對非單詞邊界,例如:'er\B' 能比對 "verb" 中的'er',但不能比對"never" 中的'er'
\b 比對一個單詞邊界,也就是指單詞和空格間的位置,例如: 'er\b' 可以比對"never" 中的 'er',但不能比對 "verb" 中的'er'
\t 比對一個橫向制表符(等價于 \x09和 \cI)
\v 比對一個垂直制表符(等價于 \x0b和 \cK)
\n 比對一個換行符(等價于 \x0a 和\cJ)
\f 比對一個換頁符(等價于\x0c 和\cL)
\r 比對一個回車符(等價于 \x0d 和\cM)
\\ 比對轉義字元本身"\"
\cx 比對由 x 指明的控制字元,例如:\cM比對一個Control-M 或回車符,x 的值必須為A-Z 或 a-z 之一,否則,将 c 視為一個原義的 'c' 字元
\xn 比對 n,其中 n 為十六進制轉義值。十六進制轉義值必須為确定的兩個數字長,例如:'\x41' 比對 "A"。'\x041' 則等價于'\x04' & "1"。正規表達式中可以使用 ASCII 編碼
\num 比對 num,其中 num是一個正整數。表示對所擷取的比對的引用
[:alnum:] 比對任何一個字母或數字([A-Za-z0-9]),例如:'[[:alnum:]] '
[:alpha:] 比對任何一個字母([A-Za-z]), 例如:' [[:alpha:]] '
[:digit:] 比對任何一個數字([0-9]),例如:'[[:digit:]] '
[:lower:] 比對任何一個小寫字母([a-z]), 例如:' [[:lower:]] '
[:upper:] 比對任何一個大寫字母([A-Z])
[:space:] 任何一個空白字元: 支援制表符、空格,例如:' [[:space:]] '
[:blank:] 空格和制表符(橫向和縱向),例如:'[[:blank:]]'ó'[\s\t\v]'
[:graph:] 任何一個可以看得見的且可以列印的字元(注意:不包括空格和換行符等),例如:'[[:graph:]] '
[:print:] 任何一個可以列印的字元(注意:不包括:[:cntrl:]、字元串結束符'\0'、EOF 檔案結束符(-1), 但包括空格符号),例如:'[[:print:]] '
[:cntrl:] 任何一個控制字元(ASCII 字元集中的前 32 個字元,即:用十進制表示為從 0 到31,例如:換行符、制表符等等),例如:' [[:cntrl:]]'
[:punct:] 任何一個标點符号(不包括:[:alnum:]、[:cntrl:]、[:space:]這些字元集)
[:xdigit:] 任何一個十六進制數(即:0-9,a-f,A-F)

四、三種不同類型正規表達式比較

注意: 當使用 BERs(基本正規表達式)時,必須在下列這些符号前加上轉義字元('\'),屏蔽掉它們的 speical meaning  “?,+,|,{,},(,)” 這些字元,需要加入轉義符号”\”

注意:修飾符用在正規表達式結尾,例如:/dog/i,其中 “ i “ 就是修飾符,它代表的含義就是:比對時不區分大小寫,那麼修飾符有哪些呢?常見的修飾符如下:

g   全局比對(即:一行上的每個出現,而不隻是一行上的第一個出現)

s    把整個比對串當作一行處理

m    多行比對

i    忽略大小寫

x    允許注釋和空格的出現

U    非貪婪比對

以上就是linux 常見3種類型正規表達式異同之處,整體了解這些,我相信在使用這些工具的時候,就可以更加清楚明晰了。

繼續閱讀