1. 程式人生 > 其它 >Shell指令碼之——正則表示式的詳解

Shell指令碼之——正則表示式的詳解

一、正則表示式

1.1 什麼是正則表示式

正則表示式(regular expression)描述了一種字串匹配的模式(pattern),可以用來檢查一個串是否含有某種子串、將匹配的子串替換或者從某個串中取出符合某個條件的子串等。在Linux中也就是代表我們定義的模式模板,Linux工具可以用它來過濾文字。

Linux的工具(如sed編輯器或者gawk程式)能夠在處理資料時使用正則表示式對資料進行模式匹配,如果資料符合匹配的要求,那麼就會進入下一步處理;如果資料不符合匹配的要求,就會被過濾掉。

正則表示式模式利用萬用字元來描述資料流中的一個或多個字元,在我們學習Linux之前的很多場景中都可以使用萬用字元來秒速不確定的資料。

我們經常使用ls命令加萬用字元來完成對資料的簡單查詢,使用 “*” 萬用字元找出來 .txt結尾的檔案,如下圖所示:

但是 *.sh 結尾列出了所有txt文字檔案,不管前面是數字還是字母,也不管有多少個,反正只要是txt結尾的檔案就行了,正則表示式的工作原理和這個類似,但是正則表示式是功能更強大,不僅可以匹配數字和字母的區別,也可以對數字和字母的個數進行過濾。

1.2 基礎正則常見元字元

1.2.1 正則表示式的組成

正則表示式是由普通字元與元字元組成:

普通字元包括大小寫字母、數字、標點符號及一些其他符號。
元字元是指在正則表示式中具有特殊意義的專用字元,可以用來規定其前導字元( 即位於元字元前面的字元)在目標物件中的出現模式。

1.2.2 常見的元字元(支援的工具:grep、egrep、sed和awk)

\ :轉義字元,用於取消特殊符號的含義,例: \!、 \n、\$等

^ :匹配字串開始的位置,例: ^a、^the、 ^#、^[a-z]

$ :匹配字串結束的位置,例: word$、 ^$匹配空行

:匹配除\n之外的任意的一p個字元,例: go.d、 g…d

* :匹配前面子表示式0次或者多次,例: goo*d、 go. *d

[ list ] :匹配list列表中的一個字元,例: go[ola]d, [abc]、 [a-z]、 [a-z0-9]、 [0-9]匹配任意一位數字

[^list] :匹配任意非list列表中的一個字元,例: [^0-9]、 [^A- Z]、 [0-9]、 [^a-z]匹配任意一位非小寫字母

\{n\} :匹配前面的子表示式n次,例: go\{2\}d、 '[0-9]\{2\} '匹配兩位數字

\{n,\} :匹配前面的子表示式不少於n次,例: go\{2,\ }d、 '[0-9]\{2, \} '匹配兩位及兩位以上數字

{n,m} :匹配前面的子表示式n到m次,例: go{2,3}d、 '[0-9]{2,3} '匹配兩位到三位數字

注: egrep、 awk使用{n}、{n,}、{n,m} 匹配時“{}"前不用加“\”

1.2.3 擴充套件正則表示式元字元(支援的工具:egrep、awk)

POSIX ERE模式包括了一些可供Linux應用和工具使用的額外符號,gawk程式能夠識別ERE模式,但是sed編輯器不能。

sed編輯器和gawk程式的正則表示式引擎之間是由區別的,gawk程式可以使用大多數擴充套件正則表示式模式符號,並且能提供一些額外的過濾功能,而這些功能都是sed編輯器所不具備的。但正因為如此,gawk程式處理資料流時才比較慢。

1 問號 ?

問號類似於星號,不過有點細微的不同,問號表示前面的字元可以出現0次或1次,僅限於此,不會匹配多次出現的字元。

將問號結合字元組一起使用
如果字元組中的字元出現了0次或1次,匹配就會成立,但是如果兩個字元都出現了,或者其中一個字元出現了2次,那麼匹配都無法成立。案例如下:

加號 +
加號是類似於星號的另一個模式符號,但跟問號也有所不同,加號表示前面的字元可以出現1次或者多次,但是必須出現1次,如果該字元沒有出現,則無法匹配。

將加號結合字元組一起使用
如果字元組中定義的任一字元出現了,文字就會匹配,全部出現也可以匹配到。

管道符號 |
管道符號允許在檢查資料流時,用邏輯OR(或)方式指定正則表示式要是用的模式,如果任意一個模式匹配了資料流文字,文字就通過,如果沒有匹配到,那麼資料則匹配失敗。
使用管道符號的格式:expr1 | expr2 | expr1....

管道符號兩側的正則表示式可以採用任何正則表示式模式(包括字元組)來定義文字。

圓括號()
將括號中的字串作為一個整體。正則表示式模式也可以使用圓括號進行分組,當我們將正則表示式模式分組時,該組會被視為一個標準字元,然後就可以像對普通字元一樣給改組使用特殊字元了。

將字元組和管道符號一起使用
(a|b)b(c|d)會匹配第一組中字元的任意組合以及第二組中字元的任意組合。

花括號 { }
花括號允許為可重複的正則表示式指定一個上限,這通常稱為間隔(interval),可以用兩種格式來指定區間。

m:正則表示式準確出現的次數m;
m,n:正則表示式至少出現m次,最多n次。
這個特性可以精確的調整字元或者字符集在模式中出現的具體次數。

預設情況下,gawk程式不會識別正則表示式間隔,必須指定gawk程式的- -interval命令列選項才能識別正則表示式的間隔。

將間隔模式結合分組和字元組一起使用