很多時候我們有對Linux系統的文件進行文本檢索或者說是文本查找的需要,這時我們就需要利用到正則表達式“grep”(Regular Expression)
。對需要進行檢索或查找的字符串進行邏輯操作,就是利用實現定義好的字符、及特定字符的組合,組成“規則字符串”,用來表達對字符串進行邏輯過濾。說白了就是用邏輯定義好的特定規則,利用邏輯組合成的正則表達式,檢索出符合規則的文本,這就是正則表達式。
正則表達式的特點:
- 驗證字符串,即驗證給定的字符串或子字符串是否符合指定的特征,例如,驗證郵箱地址是否合法等。
- 查找字符串,從給定的文本當中查找符合指定特征的字符串。
- 替換字符串,即查找到符合特征的字符串后將其替換。
- 提取字符串,即從給定的字符串中提取符合指定特征的子字符串。
常用字符及特殊符號:
RE字符 | 基礎正則表達式字符 |
---|---|
^hello | 待查找的字符串(hello) |
hello$ | 待查找的字符串(hello)在行尾 |
. | 代表一定有一個任意字符的字符 |
\ | 轉義字符,將特殊符號的特殊意義去除 |
* | 重復零個到無窮多個的前一個字符 |
[list] | 從字符集合的RE字符里面找出想要選取的字符 |
[n1-n2] | 從字符集合的RE字符里面找出想要選取的字符范圍 |
[^list] | 從字符集合的RE字符里面找出不要的字符串或范圍 |
{n,m} | 連續n到m個的前一個RE字符,若為{n}則是連續n個的前一個RE字符,若為{n,}則是連續n個以上的前一個RE字符 |
RE字符 | 擴展正則表達式字符 |
﹢ | 重復一個或一個以上的前一個RE字符 |
? | 零個或一個的前一個RE字符 |
用或(or)的方式找出數個字符 | |
( ) | 找出“組”字符串 |
( )+ | 多個重復組的判別 |
特殊符號 | 代表意義 |
[[:alpha:]] | 表示任意大小寫字母 |
[[:lower:]] | 表示任意小寫字母 |
[[:upper:]] | 表示任意大寫字母 |
[[:digit:]] | 表示0到9之間的任意單個數字(包括0和9) |
[[:alnum:]] | 表示任意數字或字母 |
[[:space:]] | 表示任意空白字符,包括"空格"、"tab鍵"等 |
[[:punct:]] | 表示任意標點符號 |
實例實踐:
文件中有三行文本,每行都包含“guangdonghuizhou”這個單詞,此時可以利用grep在此文本中搜索包含“guangdonghuizhou”的行,則可以使用如下命令。
[root@centos6 ~]# grep "guangdonghuizhou" regex
hello guangdonghuizhou
hi guangdonghuizhou
hello guangdonghuizhou
匹配到字符串每一行匹配到的都會被打印出來。
如果我們只想要打印出以“hello”開頭的行,那我們可以如下所示:
[root@centos6 ~]# grep "^hello" regex
hello guangdonghuizhou
hello guangdonghuizhou
""表示”錨定首行“,所以"hello"表示只匹配位于首行的hello字符串。
在正則表達式中,* 代表另一個意思,在正則表達式中,* 表示之前的字符連續出現任意次(包括0次),不要與通配符中的*搞混淆了。示例如下:
[root@centos6 ~]# grep -n "e*f" regex.txt
9:ef eef eeef
如上圖操作,"ef"表示e出現任意次,f必須跟在e的后頭。*
理解完上述符號后,我們再來認識兩個符號,"?"與"+"
- ? 表示匹配其前面的字符0或1次,簡單理解,就是前面的字符要么有沒有,要么有一個。
- + 表示匹配其前面的字符至少1次,簡單理解,就是前面的字符必須有至少一個。
我們來看看示例,如下:
[root@centos6 ~]# grep "abc\?" regex.txt
ab abc abcc
如上圖操作,”\?"表示c出現0次或者1次,都會被匹配到,所以ab和abc都被匹配到,ab被匹配到是因為c出現了0次,abc被匹配是因為出現了1次。
再來我們實踐另外一個符號,如下:
[root@centos6 ~]# grep "abc\?" regex.txt
ab abc abcc
可以看到,abc與abcc都被匹配到了,這是因為c+"表示c至少要出現1次,至多可以連續出現多次,連續次數不封頂,所以abc和abcc都會被匹配到。
以上如有不對的地方,請批評指正。
擴展閱讀與參考文獻:
正則表達式之基本概念 - Wayne-Zhu - 博客園
正則表達式介紹與使用 - suwu150的博客 - CSDN博客
鳥哥的 Linux 私房菜 -- 第十一章、正規表示法與文件格式化處理