1. 程式人生 > >grep 正則表示式說明

grep 正則表示式說明

首先正則表示式分為三類(man grep可以看到,分別是basic RegExs,extended RegExs,perl RegExs)

則表示式:在電腦科學中,是指一個用來描述或者匹配一系列符合某個句法規則的字串的單個字串。在很多文字編輯器或其他工具裡,正則表示式通常被用來檢索和/或替換那些符合某個模式的文字內容。許多程式設計語言都支援利用正則表示式進行字串操作。例如,在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 的行 ^string$ ^string$ ^string$ ^string$
\< 匹配單詞,例如:'\<frog' (等價於'\bfrog'),匹配以 frog 開頭的單詞 \< \< 不支援 不支援(但可以使用\b來匹配單詞,例如:'\bfrog')

\>

匹配單詞,例如:'frog\>'(等價於'frog\b '),匹配以 frog 結尾的單詞 \> \> 不支援 不支援(但可以使用\b來匹配單詞,例如:'frog\b')

\<x\>

匹配一個單詞或者一個特定字元,例如:'\<frog\>'(等價於'\bfrog\b')、'\<G\>' \<x\> \<x\> 不支援 不支援(但可以使用\b來匹配單詞,例如:'\bfrog\b'

()

匹配表示式,例如:不支援'(frog)' 不支援(但可以使用,如:dog () () ()
匹配表示式,例如:不支援'(frog)' 不支援(同()) 不支援(同()) 不支援(同())

匹配前面的子表示式 0 次或 1 次(等價於{0,1}),例如:where(is)?能匹配"where" 以及"whereis" 不支援(同\?)
\? 匹配前面的子表示式 0 次或 1 次(等價於'\{0,1\}'),例如:'whereis\? '能匹配 "where"以及"whereis" \? 不支援(同?) 不支援(同?) 不支援(同?)
? 當該字元緊跟在任何一個其他限制符(*, +, ?, {n},{n,}, {n,m}) 後面時,匹配模式是非貪婪的。非貪婪模式儘可能少的匹配所搜尋的字串,而預設的貪婪模式則儘可能多的匹配所搜尋的字串。例如,對於字串 "oooo",'o+?' 將匹配單個"o",而 'o+' 將匹配所有 'o' 不支援 不支援 不支援 不支援
. 匹配除換行符('\n')之外的任意單個字元(注意:awk 指令中的句點能匹配換行符) . .(如果要匹配包括“\n”在內的任何一個字元,請使用:'(^$)|(.) . .(如果要匹配包括“\n”在內的任何一個字元,請使用:' [.\n] '
* 匹配前面的子表示式 0 次或多次(等價於{0, }),例如:zo* 能匹配 "z"以及 "zoo" * * * *
\+ 匹配前面的子表示式 1 次或多次(等價於'\{1, \}'),例如:'whereis\+ '能匹配 "whereis"以及"whereisis" \+ 不支援(同+) 不支援(同+) 不支援(同+)
+ 匹配前面的子表示式 1 次或多次(等價於{1, }),例如:zo+能匹配 "zo"以及 "zoo",但不能匹配 "z" 不支援(同\+) + + +

{n}

n 必須是一個 0 或者正整數,匹配子表示式 n 次,例如:zo{2}能匹配 不支援(同\{n\}) {n} {n} {n}
{n,} "zooz",但不能匹配 "Bob"n 必須是一個 0 或者正整數,匹配子表示式大於等於 n次,例如:go{2,} 不支援(同\{n,\}) {n,} {n,} {n,}
{n,m} 能匹配 "good",但不能匹配 godm 和 n 均為非負整數,其中 n <= m,最少匹配 n 次且最多匹配 m 次 ,例如:o{1,3}將配"fooooood" 中的前三個 o(請注意在逗號和兩個數之間不能有空格) 不支援(同\{n,m\}) {n,m} {n,m} {n,m}

x|y

匹配 x 或 y,例如: 不支援'z|(food)' 能匹配 "z" 或"food";'(z|f)ood' 則匹配"zood" 或 "food" 不支援(同x\|y) x|y x|y x|y

[0-9]

匹配從 0 到 9 中的任意一個數字字元(注意:要寫成遞增) [0-9] [0-9] [0-9] [0-9]

[xyz]

字元集合,匹配所包含的任意一個字元,例如:'[abc]'可以匹配"lay" 中的 'a'(注意:如果元字元,例如:. *等,它們被放在[ ]中,那麼它們將變成一個普通字元) [xyz] [xyz] [xyz] [xyz]

[^xyz]

負值字元集合,匹配未包含的任意一個字元(注意:不包括換行符),例如:'[^abc]' 可以匹配 "Lay" 中的'L'(注意:[^xyz]在awk 指令中則是匹配未包含的任意一個字元+換行符) [^xyz] [^xyz] [^xyz] [^xyz]
[A-Za-z] 匹配大寫字母或者小寫字母中的任意一個字元(注意:要寫成遞增) [A-Za-z] [A-Za-z] [A-Za-z] [A-Za-z]
[^A-Za-z] 匹配除了大寫與小寫字母之外的任意一個字元(注意:寫成遞增) [^A-Za-z] [^A-Za-z] [^A-Za-z] [^A-Za-z]

\d

匹配從 0 到 9 中的任意一個數字字元(等價於 [0-9]) 不支援 不支援 \d \d

\D

匹配非數字字元(等價於 [^0-9]) 不支援 不支援 \D \D
\S 匹配任何非空白字元(等價於[^\f\n\r\t\v]) 不支援 不支援 \S \S
\s 匹配任何空白字元,包括空格、製表符、換頁符等等(等價於[ \f\n\r\t\v]) 不支援 不支援 \s \s
\W

匹配任何非單詞字元 (等價於[^A-Za-z0-9_])

\W \W \W \W
\w 匹配包括下劃線的任何單詞字元(等價於[A-Za-z0-9_]) \w \w \w \w
\B 匹配非單詞邊界,例如:'er\B' 能匹配 "verb" 中的'er',但不能匹配"never" 中的'er' \B \B \B \B

\b

匹配一個單詞邊界,也就是指單詞和空格間的位置,例如: 'er\b' 可以匹配"never" 中的 'er',但不能匹配 "verb" 中的'er' \b \b \b \b
\t 匹配一個橫向製表符(等價於 \x09和 \cI) 不支援 不支援 \t \t
\v 匹配一個垂直製表符(等價於 \x0b和 \cK) 不支援 不支援 \v \v
\n 匹配一個換行符(等價於 \x0a 和\cJ) 不支援 不支援 \n \n
\f 匹配一個換頁符(等價於\x0c 和\cL) 不支援 不支援 \f \f
\r 匹配一個回車符(等價於 \x0d 和\cM) 不支援 不支援 \r \r
\\ 匹配轉義字元本身"\" \\ \\ \\ \\

\cx

匹配由 x 指明的控制字元,例如:\cM匹配一個Control-M 或回車符,x 的值必須為A-Z 或 a-z 之一,否則,將 c 視為一個原義的 'c' 字元 不支援 不支援 \cx

\xn

匹配 n,其中 n 為十六進位制轉義值。十六進位制轉義值必須為確定的兩個數字長,例如:'\x41' 匹配 "A"。'\x041' 則等價於'\x04' & "1"。正則表示式中可以使用 ASCII 編碼 不支援 不支援 \xn

\num

匹配 num,其中 num是一個正整數。表示對所獲取的匹配的引用 不支援 \num \num
[:alnum:] 匹配任何一個字母或數字([A-Za-z0-9]),例如:'[[:alnum:]] ' [:alnum:] [:alnum:] [:alnum:] [:alnum:]
[:alpha:] 匹配任何一個字母([A-Za-z]), 例如:' [[:alpha:]] ' [:alpha:] [:alpha:] [:alpha:] [:alpha:]
[:digit:] 匹配任何一個數字([0-9]),例如:'[[:digit:]] ' [:digit:] [:digit:] [:digit:] [:digit:]
[:lower:] 匹配任何一個小寫字母([a-z]), 例如:' [[:lower:]] ' [:lower:] [:lower:] [:lower:] [:lower:]
[:upper:] 匹配任何一個大寫字母([A-Z]) [:upper:] [:upper:] [:upper:] [:upper:]
[:space:] 任何一個空白字元: 支援製表符、空格,例如:' [[:space:]] ' [:space:] [:space:] [:space:] [:space:]
[:blank:] 空格和製表符(橫向和縱向),例如:'[[:blank:]]'ó'[\s\t\v]' [:blank:] [:blank:] [:blank:] [:blank:]
[:graph:] 任何一個可以看得見的且可以列印的字元(注意:不包括空格和換行符等),例如:'[[:graph:]] ' [:graph:] [:graph:] [:graph:] [:graph:]
[:print:] 任何一個可以列印的字元(注意:不包括:[:cntrl:]、字串結束符'\0'、EOF 檔案結束符(-1), 但包括空格符號),例如:'[[:print:]] ' [:print:] [:print:] [:print:] [:print:]

[:cntrl:]

任何一個控制字元(ASCII 字符集中的前 32 個字元,即:用十進位制表示為從 0 到31,例如:換行符、製表符等等),例如:' [[:cntrl:]]'

[:cntrl:]

[:cntrl:]

[:cntrl:]

[:cntrl:]

[:punct:] 任何一個標點符號(不包括:[:alnum:]、[:cntrl:]、[:space:]這些字符集) [:punct:] [:punct:] [:punct:] [:punct:]
[:xdigit:] 任何一個十六進位制數(即:0-9,a-f,A-F) [:xdigit:] [:xdigit:] [:xdigit:] [:xdigit:]