使用單個字符串來描述、匹配一系列符合某個句法規則的字符串,這就是正則表達式。Linux 的 grep 命令是一種查找過濾工具,用於在文件中查找指定模式的字符串,其支持正則表達式。
通配符和正則表達式的區別
在談正則表達式以前,首先說一下通配符和正則表達式的區別,兩者容易混淆。曾經我把通配符認爲就是正則表達式,在本該使用統配符的地方意圖使用正則表達式,因爲沒能達到想要的結果,這才意識到不對勁。通配符通常用於linux的shell命令中,例如: linux
grep hello *
這表示在當前目錄下的全部文件中查找含「hello」字符串的文件的行。下面列出一些通配符的含義: git
- [a-z]或[12]:匹配方括號中指定範圍內的單個字符或方括號列出的其中一個字符。
- [!9]:不匹配方括號中所列字符或指定範圍內的單個字符。
- *:匹配0個字符或多個字符。
- ?:匹配任何單個字符,且不能爲空字符。
正則表達式分類
一、基本的正則表達式(Basic Regular Expression 又叫 Basic RegEx 簡稱 BREs)
二、擴展的正則表達式(Extended Regular Expression 又叫 Extended RegEx 簡稱 EREs)
三、Perl 的正則表達式(Perl Regular Expression 又叫 Perl RegEx 簡稱 PREs)
其實咱們在大多數高級編程語言中所使用的正則表達式都源自Perl。實際上,正則表達式從Perl衍生出一個顯赫的流派,叫作PCRE(Perl Compatible Regular Expression)。其餘高級語言大多基於此修改或者擴展。而 Unix/Linux 下的工具大多采用POSIX規範,同時,POSIX規範又可分爲兩種流派,即 BREs 和 EREs。
正則表達式 Extended 規範
一、字符類
. 匹配任意一個字符
[] 匹配括號中的任意一個字符
\- 用在[]中,表示字符範圍
^ 若是位於[]的開頭,則匹配除去括號中字符以外的一切字符
[[:xxx:]] grep 工具預約義的一些命名字符類,例如 [[:alpha:]] 匹配一個字母,[[:digit:]] 匹配一個數字
二、數量限定符
? 緊跟在它前面的單元匹配零次或一次
\+ 緊跟在它前面的單元匹配一次或屢次
\* 緊跟在它前面的單元匹配零次或屢次
{N} 緊跟在它前面的單元應精確匹配N次 [1-9][0-9]{2} 匹配從100 到999 的整數
{N,} 緊跟在它前面的單元至少要匹配n次
{,M} 緊跟在它前面的單元至多匹配m次
{N,M} 緊跟在它前面的單元至少匹配n次,至多匹配m次
三、位置限定符
^ 匹配行首的位置
$ 匹配行末的位置
\< 匹配單詞開頭的位置
\> 匹配單詞結尾的位置
\b 匹配單詞開頭或結尾的位置
\B 匹配非單詞開頭和結尾的位置
四、其餘特殊字符
\ 轉義字符,普通字符轉義爲特殊字符,特殊字符轉義爲普通字符
() 將正則表達式的一部分括起來組成一個單元,能夠對整個單元使用數量限定符
| 鏈接兩個表達式,表示或的關係
以上介紹的是grep正則表達式的 Extended 規範,Basic 規範也有這些語法,只是字符 ?+{}|() 應解釋爲普通字符,要表示上述特殊含義則須要加 \ 轉義。若是用 grep 而不是 egrep,而且不加 -E 參數,則應該遵守Basic 規範來寫正則表達式。固然,若是是 grep -F,則只搜索固定字符串而不搜索正則表達式模式,不會按正則表達式語法解析後邊的參數,grep -F 等價於 fgrep。
最後須要強調的一點是,grep 找的是包含某一模式的行,而不是徹底匹配某一模式的行。也就是說,grep 的正則表達式匹配是以行爲單位的。 正則表達式
一些示例
搜索以小寫字母開頭的行
grep -n '^[a-z]' temp.txt
-n 參數表示輸出時顯示匹配的行號 shell
搜索開頭不是英文字母的行
grep -n '^[^a-zA-Z]' temp.txt
搜索空行
grep -n '^$' temp.txt
搜索以 g 開頭和結尾的字符串在的行
grep -n 'g.*g' temp.txt
搜索g開頭和結尾,中間是至少一個o的字符串
grep -n 'goo*g' temp.txt