首頁 > 軟體

30分鐘帶你玩轉正規表示式

2020-06-16 16:48:58

定義:

正規表示式說白了就是有普通字元、以及特殊字元組成的文子模式。{匹配模式標準}

正規表示式將會作為一個模板與所搜尋的字串進行匹配。可以讓使用者輕易達到搜尋/刪除/取代某些特定字元的處理程式。此外vimgrepfindawksed等命令都支援正規表示式

註:在這裡希望大家搞明白一件事,那就是萬用字元和正規表示式的區別與關係:

1、正規表示式是用來匹配字串的,這個就不解釋了
2、萬用字元是用來通配的,也就是shell在做Pathname Expansion時用到的

那麼在什麼情況下使用呢?

 在什麼地方使用萬用字元?答案是只要是shell命令列或者shell指令碼中,你都可以使用萬用字元

 在什麼地方使用正規表示式?當你使用能夠支援正規表示式的工具軟體進行字串處理時你就可以使用正規表示式

一、常用的正規表示式:

1)、 .  代表任意單個字元;如要檢視某行中的put,可以使用p.t 檔名與之相互匹配。

 

2)、 ^號代表開始;如以T開頭的行進行匹配.

 

3)、$代表行的結束;如以tty結束的行進行匹配:

 

4)、[...]匹配括號中的字元之一。但是只要有和方括號內的字元相同將會全部匹配:

[tty] 匹配包含tty其中之一字元或者全部包括

 

註:數位或者大小寫字元和上面的都是相同的道理這裡不在演示,有興趣大家可以自己進行測試。

5)、[^xx]這個表示把某個字元或者數位排除在外的匹配,類似與取反的操作:

 

6)、 * 用於修飾前導字元,表示前導字元出現0次或任意多次,*代表所有和前導字元相同的字元。如:

 

7)、?同樣用於修飾前導字元,表示前導字元出現0次或者1次

8)、+修飾前導字元,表示前導字元出現1次或者多次

這三種方式的使用方式基本一樣,但就是前導字元出現的次數有所不同,上面已經標明了次數

9)、{n,m}同樣用於修飾前導字元,但是在這裡的n和m表示的是出現的次數,而不是個數,希望大家千萬不要混淆。比如匹配連續2到4個a

 

注意了:在這裡換可以使用其他的兩種方式進行顯示結果:

方式一:

 

方式二:

 

這裡使用的三種方式進行顯示,但是呢,都是進行了轉譯之後才可以的到想要的結果。egrep就屬於轉譯,另外grep -E也是轉譯,最後a{2,4}也是轉譯,不管使用那種方式,都可以得到想要的結果,

  用於跳脫緊跟其後的單個特殊字元,使該特殊字元成為普通字元

在這裡這個不做深入的研究。

另外還有其他的幾種形式:

{n} 連續的n個前導字元

{n,} 連續的至少n個前導字元

不知道上面的大傢伙有沒有看明白,如果要是沒有看明白的話這裡將會為大家繼續講解一個綜合的例子希望大家可以看的更加明白一些:

Christian Scott lives here and will put on a Christmas party.

There are around 30 to 35 people invited.

They are:

  Tom

Dan

 Rhonda Savage

Nicky and Kimerly.

Steve, Suzanne, Ginger and Larry.

搜尋行以AZ的一個字母開頭,然後跟兩個任意字母,然後跟一個換行符的行。將找到第5行。

 

搜尋以一個大寫字母開頭,後跟0個或多個小寫字母,再跟數位3,再跟05之間的一個數位。

搜尋以0個或多個空格開頭,跟一個大寫字母,兩個小寫字母和一個換車符

 

將查詢以0個或多個大寫或小寫字母開頭,不跟逗號,然後跟0個或多個大寫或小寫字母,然後跟一個換車符。

 

二、grep命令的用法:

相信大家之前多多少少之前對grep都有過了解和使用,比如擷取,再或者結合管道符、重定向符號進行使用,那麼今天就讓大家對grep有一個更深如層次的了解;

grep(全面搜尋正規表示式並把行列印出來)是一種強大的文字搜尋工具,它能使用正規表示式搜尋文字,並把匹配的行列印出來.

大家可以通過grep --help幫助來檢視關於grep的更多引數命令,在這裡就為大家介紹其中常用的幾種:

-A NUM--after-context=NUM   除了列出符合行之外,並且列出後NUM行。

 

-B NUM--before-context=NUM   -A NUM 相對,但這此引數是顯示除符合行之外並顯示在它之前的NUM

 

-C [NUM], -NUM, --context[=NUM]  列出符合行之外並列出上下各NUM行,預設值是2

-i--ignore-case 忽略大小寫差別

-n--line-number 在匹配的行前面列印行號

-v--revert-match  反檢索,只顯示不匹配的行

要用好grep這個工具,其實就是要寫好正規表示式,所以這裡不對grep的所有功能進行範例講解,只列幾個例子,講解一個正規表示式的寫法。

$ ls -l | grep  '^d'
通過管道過濾ls -l輸出的內容,只顯示以d開頭的行。

 

$grep  '.$'  filename

顯示以.為結尾的所有行。

 

總結grep

這幾個引數不在進行演示了相信大家已經明白了grep的基本用法了,但是grep的引數選項可不止這一點點,如果想要掌握更多的引數,就要學會檢視幫助--help再或者檢視man手冊

三、sed的用法:

sed是一種線上編輯器,它一次處理一行內容。處理時,把當前處理的行儲存在臨時緩衝區中,稱為模式空間pattern space),接著用sed命令處理緩衝區中的內容,處理完成後,把緩衝區的內容送往螢幕。接著處理下一行,這樣不斷重複,直到檔案末尾。

注意:雖然sed把處理的內容傳送到了螢幕之上,但是檔案本身的內容卻並沒有改變,如果要想改變最簡單的方法就是使用引數【-i】即可。另外也可以重定向到其他檔案之下。

sed的基本命令:

1)、替換:s命令

這是最為常用的命令

比如:

 

為啥有一個people沒有被替換掉呢?

那是因為sed 's/people/aaaaa/g' test.text沒有加g

2) & 表示匹配的字串

有時可能會想在匹配到的字串周圍或附近加上一些字元 .
 如: sed 's/abc/(abc)/' filename

 

 該例子在找到的 abc 前後加上括號 .
 該例子還可以寫成 sed 's/abc/(&)/' filename

 

 下面是更複雜的例子 :

取得eno16777736網絡卡IP地址:

 

3)、刪除行:d命令

從某個檔案當中刪除包含關鍵字元的所有行:

/etc/passwd的內容顯示並找印行號,同時將2~5刪除

 

不知道大家對正規表示式有沒有認識和了解,今天就為大家帶來這些,另外這些東西是看不會的,要多實操才可以幫助大家加深印象和理解的。如果有什麼地方需要和本人交流請留言。

Linux公社的RSS地址:https://www.linuxidc.com/rssFeed.aspx

本文永久更新連結地址https://www.linuxidc.com/Linux/2018-08/153547.htm


IT145.com E-mail:sddin#qq.com