1. 程式人生 > >Linux shell 正則表示式(BREs,EREs,PREs)差異比較

Linux shell 正則表示式(BREs,EREs,PREs)差異比較

文章總結的很好,超級強大,必須收了,感謝!

轉載自: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 的行 ^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)' 不支援(但可以使用,如:dogdog () () ()

匹配表示式,例如:不支援'(frog)' 不支援(同()) 不支援(同()) 不支援(同())

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

相關推薦

Linux shell 表示式(BREs,EREs,PREs)差異比較

文章總結的很好,超級強大,必須收了,感謝! 轉載自:http://www.cnblogs.com/chengmo/archive/2010/10/10/1847287.html 正則表示式:在電腦科學中,是指一個用來描述或者匹配一系列符合某個句法規則的字串的單個字串。在很多文字編輯器或其他工

UNIX和Linux Shell表示式語法介紹

非常奇怪,直到今天我仍然能重複週六早上的經典歌曲“Conjunction Junction”。這是好事(看了太多電視)還是壞事(也許是我現在職業的先兆)仍然有待討論。不管怎樣,這首小調在歡快的節奏下傳遞了基本的資訊。 我還沒有為學習 UNIX 構想出與“Conjunction Junction”相似的作品,

Linux 下用bash shell表示式批量處理檔案的應用例項

程式碼檔案頭有版本資訊,下面一段shell指令碼就是用來收索和更新程式碼頭註釋裡面的斑斑資訊的。 從中可以到shell指令碼中以下幾個小技術點是如何運用的: 1. 利用正則表示式分組匹配指定內容 2. 字串的定位,截斷和拼接處理 3. 指定檔案指定行替換指定內容 #!/bi

一個簡單的例子區分linux shell 表達式中的 *,+,?

-s span TE 的區別 entos oot bar 一個 區分 1,linux shell 正則表達式 *和+號的區別例子記憶:[root@mycentos data]# touch test.txt[root@mycentos data]# cat>>t

3分鐘搞定Linux系統表示式

正則表示式是一種字元模式,用於在查詢過程中匹配製定的字元。   元字元通常在Linux中分為兩類:Shell元字元,由Linux Shell進行解析; 正則表示式元字元,由vi/grep/sed/awk等文字處理工具進行解析; 正則表示式一

Shell表示式 & Grep表示式 & shell字串處理

摘自:https://www.cnblogs.com/hoji-real/articles/2311214.html   Shell正則表示式 一個正則表示式就是由普通字元(例如字元 a 到 z)以及特殊字元(稱為元字元)組成的文字模式。該模式描述在查詢文字主體時待匹配的一個或

linux學習(表示式)

正則表示式 基礎正則表示式 特殊字元 [:alnum:] 代表英文大小寫字元及數字,即0-9,A-Z,a-z [:alpha:] 代表任何英文大小寫字元,即A-Z,a-z [:digit:] 代表數字而

Shell表示式及例項

一、Shell 正則表示式 基礎正則表示式:BRE 擴充套件正則表示式:ERE,擴充套件的表示式有+,?,|,(),grep選項-E . 匹配除換行符之外的任意單個字元 注意是單個字元,比如匹配1234,就應當是1…4,中間是兩個點

大資料工作中常用的20條語句(hive,yarn,Linux表示式等)

1.檢視hadoop任務 yarn application -list |grep 使用者名稱 yarn application -kill application_1443009203033_86621 2.liunx nohup命令 nohup ./label_driver.sh >

bash萬用字元 shell表示式

在linux中 萬用字元是系統命令使用,一般用來匹配檔名或者什麼的用在系統命令中。萬用字元是系統級別的,萬用字元多用在檔名上,比如查詢find,ls,cp,rm 正則表示式是操作字串,以行尾單位來匹

linux表示式中特殊符號的含義

廢話不說,直接上圖 萬用字元與正則表示式 容易混淆,首先要明白二者是不同的,個人感覺萬用字元用於Linux的shell命令(如檔名相關操作)中,而正則表示式用於文字內容中的字串

Shell表示式中元字元含義彙總

^x => 以x開頭 {n} => 匹配n次 x$ => 以x結尾 {n,} => 至少匹配n次 . => 單個任意字元 {n,m} => 匹配n-m次 [anx] => 匹配[]中的一個字元 +

Linux表示式的使用及grep工具

正則表示式 規定一些特殊語法表示字元類、數量限定符和位置關係,然後用這些特殊語法和普通字元一起表示一個模式。 字元類 例如: 匹配電話號碼的正則表示式:1[3578][0-9]{9}。 表示第一位是1,第二位是3、5、7、8中的一個,後面9位都

[一天幾個linux命令] shell指令碼之表示式

shell指令碼之正則表示式 原文連結:Linux–shell指令碼之正則表示式 概念及特點 概念 正則表示式是對字串操作的一種邏輯公式,就是用事先定義好的一些特定的字元、及這些特定字元的組合,組成一個"規則字串",這個"規則字串"用來表達對字串的一種過濾邏輯。規定一些特殊語

linux學習筆記之shell程式設計(一)表示式與字元處理

shell程式設計 基礎正則表示式 正則和萬用字元的區別:正則是包含匹配,匹配檔案內容,grep,awk等支援正則表示式。萬用字元是完全匹配,匹配檔名,例如find,ls不認識正則表示式 ####正則表示式常用的字元(注意區別於萬用字元裡面的符號)#### -*

Linux學習基礎之Shell程式設計——表示式

1、正則表示式與萬用字元 》正則表示式用來在檔案中匹配符合條件的字串,正則是包含匹配。grep、awk、sed等命令可以支援正則表示式。 》萬用字元用來匹配符合條件的檔名,萬用字元是完全匹配。ls、find、cp等這些命令不支援正則表示式,所以只能使用shell自己的萬用字元來進行匹配了

Linux Shell筆記之表示式

Linux中,兩種流行的正則表示式引擎 1.POSIX基本正則表示式(BRE)引擎 2.POSIX擴充套件正則表示式(ERE)引擎 sed編輯器只實施了BRE引擎規範的子集 gawk程式使用ERE引擎一、基本正則表示式BRE 1.純文字 # echo "This is a test"| sed -n '/th

linuxshell 程式設計之擴充套件表示式

1. ‘+’ 限定字元 +限定符表示前面字元至少出現一次或者多次。與*不同在於0次或者多次 2. '?' 限定符 ?限定前面的字元最多出現一次。即出現0次或者1次 3. 數線 |和圓括號() 例如

表示式 linux shell

正則表示式 熱身 正則表示式(regular expression)描述了一種字串匹配的模式,可以用來檢查一個串是否含有某種子串、將匹配的子串做替換或者從某個串中取出符合某個條件的子串等。 例如 grep, expr, sed , awk. 或Vi中經常會使用到正則表示式,為了充分發揮 shell 程式設計

表示式 linux shell 刪除偶數奇數行 取得最後一個字元 s/\(^.*$\)\n^.*$/\1/g

alert(){ #Usage:alert <$?> <object> if [ "$1" -ne 0 ] then echo "WARNING:$2 did not complete succfully." >&2 e