Linux Bash Shell程式設計(六):正則表達式 基本元字元應用範例

2020-08-14 01:04:38

  上一節中,我們瞭解了Bash Shell中的變數計算、變數內容替換和環境變數組態檔相關內容。在瞭解了變數及其相關運算/操作後,本節開始,我們將一起瞭解Shell中的字串處理方面內容,由於Bash的部分命令支援正則表達式,我們也將一併瞭解正則表達式的基礎用法

Bash Shell(六)

正則表達式簡介

  正則表達式是一種字串匹配模式,用來在檔案中匹配符合條件的字串,正則是包含匹配(檔案行中包含條件就匹配),可以用正則表達式匹配更復雜的要求。grep awk sed命令支援正則表達式。

  而同樣在Shell中使用的萬用字元則用來匹配符合條件的檔名,是完全匹配,ls find cp不支援正則表達式,僅能使用萬用字元,萬用字元的匹配條件較爲簡單 。

基礎正則表達式元字元

元字元 作用
* 前一個字元匹配0次或任意多次
\+ 前一個字元匹配1次或任意多次
. 匹配除了換行符以外任意一個字元
^ 匹配行首。匹配以後面的文字開頭的行
$ 匹配行尾,即以後面的文字結尾的行
[] 匹配括號中指定的任何一個字元(僅一個),同萬用字元
[^] 取反, 匹配除括號中字元以外的任意一個字元,同萬用字元
\ 跳脫符,取消特殊符號的含義
\{n\} 表示其前面的字元恰好出現n次
\{n,\} 表示其前面的字元出現不小於n次
\{n,m\} 表示其前面的字元至少出現n次,最多出現m次。

元字元用法及注意事項

  • 對於* \+兩個元字元(例如"a*"),若獨立作爲匹配條件沒有意義,由於包含匹配特性,可以有如"aa*""a"代替的簡便方式,該元字元一般用於詞內部的單個字元重複情況。例如,

    要匹配類似於"uuuuuuuraaaaa"(ua數量未知)的單詞,可以使用"u*ra*"的匹配條件

  • 行首元字元必須在第一位,例如"^abc";行尾元字元必須在最後一位,例如"abc$"

  • .相當於萬用字元中的?,可以匹配任意字元,包括空字元

  • 方括號類元字元中可以使用列舉型集合,也可以使用區間首尾用減號-連線,比如匹配所有小寫字母使用"[a-z]",匹配非數位字元用"[^0-9]"。僅針對一個字元

  • 花括號(無論左右)的左邊必須有跳脫符\

  • 關於花括號元字元:不是匹配在一行中出現該字元的個數,而是連續出現該字元的個數,獨立作爲匹配條件時設定最大值無意義,仍可以認爲該行中包含了不超過最大值次重複的字元

正則表達式應用場景

支援正則表達式的命令有很多,下面 下麪選取比較常用的字串搜尋命令grep進行樣例示範

#grep命令語法
grep [mode] [options] <pattern> <filename>
#描述模式的匹配型別 模式 檔名
  • 模式的匹配型別
模式型別 作用
-E 擴充套件正則表達式
-F 字串
-G 基本正則表達式(預設模式型別)
-P Perl正則表達式
  • grep命令常見選項
選項 說明
-n 顯示匹配行的同時顯示行號
-b 顯示位元組偏移(第幾個字元)
-i 在匹配時忽略大小寫
-v 匹配條件取反,顯示不匹配該條件的行
  • 匹配模式即爲匹配條件,符合條件的行將被篩選顯示
  • grep命令同樣支援管道符(常用)和控制檯輸入,控制檯輸入結束以ctrl+d結束(可多行,故不能以enter結束)
  • 匹配模式要用雙引號""包含,否則搜尋輸出結果可能產生錯誤

正則表達式範例

首先建立一個帶有部分素材的檔案,隨個人喜好編輯

#以下內容儲存在測試素材檔案a中
Hello!
I am Zheng@Kali
The excutible files' extension in windows is .exe
I am a enthusiastic man.
My Phone number is 13957191293.
isn't it a good idea?
eeee
uuuuuuraaaaa! uuuraaaa!
  1. 匹配手機號

    手機號的第一位一般爲1,第二位一般爲3-8,後九位任意

zheng@Kali:~/temp$ grep "1[3-8][0-9]\{9\}" a
My Phone number is 13957191293.
#匹配模式一定要用""包含
  1. 找出以 i 開頭的行

    grep "^i" a
    isn't it a good idea?
    
    grep -i "^i" a  #使用忽略大小寫選項
    I am Zheng@Kali
    I am a enthusiastic man.
    isn't it a good idea?
    
  2. 元字元* +範例

    範例內容同用法及注意事項

    zheng@Kali:~/temp$ grep "u*ra*" a
    My Phone number is 13957191293.
    uuuuuuraaaaa! uuuraaaa!
    
    zheng@Kali:~/temp$ grep "u*ra\+" a #使用 + 元字元一定要使用跳脫符,否則相當於直接匹配加號
    uuuuuuraaaaa! uuuraaaa!
    

    注意:上範例中u與a沒有出現的情況,若行中不出現匹配模式中的字元, 仍然能匹配,而 + 不能匹配*


下一節,我們將學習bash中的字串擷取、輸出與處理命令
上一節,Linux Bash Shell程式設計(五):變數(下)變數運算、內容替換、環境變數組態檔