上一節中,我們瞭解了Bash Shell中的變數計算、變數內容替換和環境變數組態檔相關內容。在瞭解了變數及其相關運算/操作後,本節開始,我們將一起瞭解Shell中的字串處理方面內容,由於Bash的部分命令支援正則表達式,我們也將一併瞭解正則表達式的基礎用法
正則表達式是一種字串匹配模式,用來在檔案中匹配符合條件的字串,正則是包含匹配(檔案行中包含條件就匹配),可以用正則表達式匹配更復雜的要求。grep
awk
sed
命令支援正則表達式。
而同樣在Shell中使用的萬用字元則用來匹配符合條件的檔名,是完全匹配,ls
find
cp
不支援正則表達式,僅能使用萬用字元,萬用字元的匹配條件較爲簡單 。
元字元 | 作用 |
---|---|
* | 前一個字元匹配0次或任意多次 |
\+ | 前一個字元匹配1次或任意多次 |
. | 匹配除了換行符以外任意一個字元 |
^ | 匹配行首。匹配以後面的文字開頭的行 |
$ | 匹配行尾,即以後面的文字結尾的行 |
[] | 匹配括號中指定的任何一個字元(僅一個),同萬用字元 |
[^] | 取反, 匹配除括號中字元以外的任意一個字元,同萬用字元 |
\ | 跳脫符,取消特殊符號的含義 |
\{n\} | 表示其前面的字元恰好出現n次 |
\{n,\} | 表示其前面的字元出現不小於n次 |
\{n,m\} | 表示其前面的字元至少出現n次,最多出現m次。 |
對於*
\+
兩個元字元(例如"a*"
),若獨立作爲匹配條件沒有意義,由於包含匹配特性,可以有如"aa*"
用"a"
代替的簡便方式,該元字元一般用於詞內部的單個字元重複情況。例如,
要匹配類似於"uuuuuuuraaaaa"(u
與a
數量未知)的單詞,可以使用"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,第二位一般爲3-8,後九位任意
zheng@Kali:~/temp$ grep "1[3-8][0-9]\{9\}" a
My Phone number is 13957191293.
#匹配模式一定要用""包含
找出以 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?
元字元*
+
範例
範例內容同用法及注意事項
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程式設計(五):變數(下)變數運算、內容替換、環境變數組態檔