天天看點

基礎正規表達式字元及用法

一、什麼是正規表達式

簡單的說,正規表達式就是處理字元串的方法,是以行為機關來進行字元串的處理行為,通過一些特殊字元的輔助,用以查找、替換、删除某特定字元串的處理程式。

二、語系對正規表達式的影響

我們知道,我們看到的字元文字與數字都是通過編碼表轉化而來的。由于不同語系的編碼表是不相同的,是以會造成資料選取結果的不同。

舉個例子,在英文大小寫的編碼順序中,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

是以,在使用正規表達式時,需要注意當時環境的語系是什麼,否則會影響選取結果。 

下面介紹一些特殊符号的含義:

基礎正規表達式字元及用法

三、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的字元串

繼續閱讀