Linux shell 通配符、正則表達式(BREs,EREs,PREs)差別比較

正則表達式:在計算機科學中,是指一個用來描述或者匹配一系列符合某個句法規則的字符串的單個字符串。在不少文本編輯器或其餘工具裏,正則表達式一般被用來檢索和/或替換那些符合某個模式的文本內容。許多程序設計語言都支持利用正則表達式進行字符串操做。例如,在Perl中就內建了一個功能強大的正則表達式引擎。正則表達式這個概念最初是由Unix中的工具軟件(例如sed和grep)普及開的。正則表達式一般縮寫成「regex」,單數有regexp、regex,複數有regexps、regexes、regexen。這些是正則表達式的定義。因爲起源於unix系統,所以不少語法規則同樣的。可是隨着逐漸發展,後來擴展出如下幾個類型。瞭解這些對於學習正則表達式。php

1、正則表達式分類:

一、基本的正則表達式(Basic Regular Expression 又叫 Basic RegEx  簡稱 BREs)html

二、擴展的正則表達式(Extended Regular Expression 又叫 Extended RegEx 簡稱 EREs)python

三、Perl 的正則表達式(Perl Regular Expression 又叫 Perl RegEx 簡稱 PREs)linux

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

2、Linux 中經常使用文本工具與正則表達式的關係 

常握 Linux 下幾種經常使用文本工具的特色,對於咱們更好的使用正則表達式是頗有幫助的正則表達式

  • grep , egrep 正則表達式特色:算法

1)grep 支持:BREs、EREs、PREs 正則表達式shell

grep 指令後不跟任何參數,則表示要使用 」BREs「 express

grep 指令後跟 」-E" 參數,則表示要使用 「EREs「segmentfault

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、常見 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\}'),例如:'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} {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:]]'&oacute;'[\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:]

4、Perl 正則中的修飾符

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

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

g   全局匹配(即:一行上的每一個出現,而不僅是一行上的第一個出現)
s    把整個匹配串看成一行處理
m    多行匹配
i    忽略大小寫
x    容許註釋和空格的出現
U    非貪婪匹配

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

5、通配符和正則表達式區別

再次強調:正規表示法的特殊字符與通常在shell命令行中的通配符並不相同

字符

Shell  通配符含義

RE正則表達式含義

*

匹配0到任意個字符

n個前導RE字符  n>=0(組合態)

.

無特殊含義

任意一個字符

1個任意字符

0或1個前導RE字符(組合態)

|

管道

邏輯表達式或 or

[xyz]

xyz中任意一個字符

xyz中任意一個字符(和shell通配符含義同樣)

[a-z] [0-9]

a-z 0-9 之間任意一個字符

同前

[^xyz] [^a-z]

^取補做用

同前

{a,b,c}

大括號變量擴展:{a,b,c}.txt 會被展開爲:a.txt b.txt c.txt

須要轉義:\{m,n\} ,具體參照上方描述

\

轉義字符

轉義字符

舉例來講,不支持正規表示法的 ls 這個工具中,若咱們使用 『ls -l * 』 表明的是任意檔名的文件,而 『ls -l a* 』表明的是以 a 爲開頭的任何檔名的文件, 但在正規表示法中,咱們要找到含有以 a 爲開頭的文件,則必需要這樣:(需搭配支持正規表示法的工具)

ls | grep -n '^a.*'

6、正則全景圖

REF:

[1] Linux/Unix工具與正則表達式的POSIX規範:

http://www.infoq.com/cn/news/2011/07/regular-expressions-6-POSIX

[2] Perl, PHP, Python, Ruby 區別對比:

Interpreted Languages: Perl, PHP, Python, Ruby (Sheet One)

http://hyperpolyglot.org/scripting

[3] grep之字符串搜索算法Boyer-Moore由淺入深(比KMP快3-5倍)

http://blog.jobbole.com/52830/

[4] 衆裏尋她千百度--正則表達式

http://blog.segmentfault.com/xuelang/1190000000644426

[5] 強大的Perl中的正則

http://www.php-oa.com/2008/12/20/power-perl.html

[6] 正則表達式「派別」簡述

http://liujiacai.net/blog/2014/12/07/regexp-favors/

[7] bash通配符和正則表達式

http://blog.csdn.net/hittata/article/details/8911117

[8] 正則表達式基礎

http://blogread.cn/it/article/7482?f=wb

相關文章
相關標籤/搜索