一、什麼是正規表達式
簡單的說,正規表達式就是處理字元串的方法,是以行為機關來進行字元串的處理行為,通過一些特殊字元的輔助,用以查找、替換、删除某特定字元串的處理程式。
二、語系對正規表達式的影響
我們知道,我們看到的字元文字與數字都是通過編碼表轉化而來的。由于不同語系的編碼表是不相同的,是以會造成資料選取結果的不同。
舉個例子,在英文大小寫的編碼順序中,zh_CN.big5及C這兩種語系的輸出結果分别入下:
LANG=C: 0 1 2 3 4……A B C……a b c……z
LANG=zh_CN: 0 1 2 3 4……a A b B……z Z
是以,在使用正規表達式時,需要注意當時環境的語系是什麼,否則會影響選取結果。
下面介紹一些特殊符号的含義:
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiI0gTMx81dsQWZ4lmZf1GLlpXazVmcvwFciV2dsQXYtJ3bm9CX9s2RkBnVHFmb1clWvB3MaVnRtp1XlBXe0xCMy81dvRWYoNHLwEzX5xCMx8FesU2cfdGLwMzX0xiRGZkRGZ0Xy9GbvNGLpZTY1EmMZVDUSFTU4VFRR9Fd4VGdsYTMfVmepNHLrJXYtJXZ0F2dvwVZnFWbp1zczV2YvJHctM3cv1Ce-cmbw5SO3UTMzUzNyUGZykDZ3QjNzYzXwUDO0ATM0AzLcFTMyIDMy8CXn9Gbi9CXzV2Zh1WavwVbvNmLvR3YxUjLyM3Lc9CX6MHc0RHaiojIsJye.png)
三、grep的一些進階參數
grep [-A] [-B] [–color=auto] ‘搜尋字元串’ filename
參數:
-A:後面可加數字,除了列出該行外,後序的n行也列出來
-B:前面可加數字,除了列出該行外,前面的n行也列出來
–color=auto可将正确的那個選取資料列出顔色
eg:用dmesg列出核心資訊,用grep找出内含eth的那行。
四、基礎正規表達式字元(例子見下文)
1、待查找的字元串(word)在行首
RE字元:^word
範例 :查找行首為#開始的那一行,并列出行号(grep 後帶 -n 的作用)
指令 :grep -n '^#' regular_express.txt
2、待查找的字元串(word)在行尾
RE字元:word$
範例 :将行尾為!的那一行列印出來,并列出行号
指令 :grep -n '!$' regular_express.txt
3、代表一定有一個任意字元的字元
RE字元:.
範例 :查找的字元串可以是(eve)(eae)(eee)(e e),但不能有(ee)!即e與e中間一定“有且僅有”一個字元,而空格也是字元
指令 :grep -n 'e.e' regular_express.txt
4、轉義字元,将特殊符号(比如^ $ . \ * [ ]等等)的特殊意義去除
RE字元:\
範例 :查找含有單引号'的那一行
指令 :grep -n '\'' regular_express.txt #注意\後面是兩個單引号,而非一個雙引号
5、重複零個到無窮多個的前一個字元
RE字元:*
範例 :找出含有(es)(ess)(esss)等的字元串,注意,因為*可以是0個,是以 es 也是符合待查找字元串。另外,因為 * 為重複“前一個RE字元”的符号,是以,在*之前必須緊接着一個RE字元。例如任意字元則為".*"(注意星号前面是一個英文句号,因為英文句号代表“有且僅有一個任意字元”)。
指令 :grep -n 'ess*' regular_express.txt #因為*可以是0個,是以 es 也是符合待查找字元串
6、從字元集合的RE字元裡面找出想要選取的字元
RE字元:[list]
範例:查找含有(gl)或(gd)的那一行,需要特别留意的是,在[]當中代表一個待查找的字元,例如"a[afl]y"代表查找的字元串可以是aay、afy、aly,即[afl]代表的是a或f或l的意思。
指令 :grep -n 'g[ld]' regular_express.txt
7、從字元集合的RE字元裡面找出想要選取的字元範圍
RE字元:[n1-n2]
範例:查找含有任意數字的那一行。需要特别注意的是,在字元集合[ ]中的減号-是有特殊意義的,它代表兩個字元之間的所有連續字元。 但這個連續與否與ASCII編碼有關,是以,你的編 碼需要設定正确(在bash當中,需要确定LANG與LANGUAGE的變量是否正确)!例如所有大寫字元則為[A-Z]。
指令 :grep -n '[0-9]' regular_express.txt #查找含有任意數字的那一行
grep -n '[A-Z]' regular_express.txt #查找含有任意大寫字母的那一行
8、從字元集合的RE字元裡面找出不要的字元串或範圍
RE字元:[^list]
範例 :查找的字元串可以是(oog)(ood)但不能是(oot),那個^在[ ]内代表的意義是”反向選擇“的意思。例如,我不要大寫字母,則為[^A-Z]。但是,需要特别注意的是,如果以 grep -n [^A-Z] regular_express.txt 來查找,卻發現該檔案内的所有行都被列出,為什麼?因為這個[^A-Z]是”非大寫字元“的意思,因為每一行均有非大寫字母。
指令 :grep -n 'oo[^t]' regular_express.txt
9、連續n到m個的前一個RE字元,若為\{n\}則是連續n個的前一個RE字元,若為\{n,\}則是連續n個以上的前一個RE字元
RE字元:\{n,m\}
範例 :在g與g之間有2個到3個的o存在的字元串,即(goog)(gooog)
指令 :grep -n 'go\{2,3\}g' regular_express.txt
五、基礎正規表達式練習
我們用例題感受了解一下正規表達式。
下面用的檔案是在鳥哥的網站下下載下傳的,如下指令:
例題1、查找特定字元串
比如含有’the’這個特定的字元串:
查找不含“the”字元串
不論大小寫的“the”這個字元串
例題二:利用中括号[]查找集合字元
如果我想要查找test與taste兩個單詞有共同點是,都含有’t?st’ ,可以這樣來查找。
查找含oo的字元:
但是,不想要前面有g的話,可以利用在集合字元的反向選擇[^]來完成:
例題3:行首與行尾字元^$
當我們需要查詢的字元隻在行首列出,這個時候可以使用制表符了:
證明隻有12行是the開頭的。
查找第一個字元以a~z開頭的:
查找第一個字元是大寫的 :
查找第一個字元是小
寫的:
^在字元集合符号[]之内和之外是不同的,在[]之内表示反向選擇,在[]之外表示定位在行首。
那麼行尾呢?
行尾結束為小數點.的那一行
小數點具有其他的意義,是以我們使用轉義字元\來解除特殊意義。
查找空白行:
例題4:任意一個字元.與重複字元
注意正規表達式并不是通配符,我們需要了解正規表達式中的幾個符号:
.(小數點):一定有一個任意字元
*(星号):重複前一個0到無窮多次,為組合形态
我們通過例子了解:
查找g??d的字元串 ,即開頭是g結束是d:
o*代表具有空字元串或一個o以上的字元,則會将所有的結果列印出來
oo*代表第一個o必須存在,第二個o可有可無
ooo*查找含有至少兩個以上oo的字元串
如下:
查找字元串開頭結尾都是g的:
查找以g開頭和結尾的字元串所在的行,但中間的字元可有可無
例題5:限定連續RE字元範圍{}
因為{}在shell中有特殊意義,我們必須用轉義字元來讓它失去特殊意義
如果查找兩個o的字元串