正則表達式的使用需要借助于工具程序來實現,我們使用grep來演示正則表達式元字符的使用。
grep使用方法
grep是一種文本搜索工具,根據用戶指定的文本模式(搜索條件)對目標文件進行逐行搜索,顯示能匹配到的行。
使用grep在/etc/passwd文件中找到有”roo”關鍵字的行并顯示了出來
grep命令的語法:
grep [OPTIONS] PATTERN [FILE…]
PATTERN:文本字符和正則表達式的元字符組合而成的匹配條件
OPTOINS:此處只列舉常用的選項
–color=auto:給關鍵字加上顏色
可以在全局配置文件/etc/bashrc中定義命令別名grep=”grep –color=auto”,以使grep命令默認輸出顏色
-i:忽略大小寫
–v:顯示沒有被模式匹配的內容
-o:只顯示被模式匹配的串本身
-n:顯示行號
-A #:顯示匹配字符的后面“#”行
顯示包含roo字符行的后面一行
-B #:顯示匹配字符的前面“#”行
顯示包含ROO字符行的前面一行
-C #:顯示匹配字符的前后面“#”行
顯示包含roo字符的前后各一行
-E:擴展正則表達式
正則表達式:Regular Expression, REGEXP
常用正則表達式分為兩種
1. 基本正則表達式(Basic REGEXP)
grep
2. 擴展正則表達式(Extended REGEXP)
egrep、grep -E
元字符:不表示其字面意義,而用于額外功能性描述
基本正則表達式的元字符:
字符匹配:
. :匹配任意單個字符
r..t:表示以r開頭,中間包含兩個任意字符并以t結尾的字符串
[ ]:匹配指定范圍內的任意單個字符
r[a-z]t:表示以r開頭,中間包含一個任意小寫字母并以t結尾的字符串
可以使用一些特殊符號還表示特定的值范圍
[[:digit:]] :表示數字,相當于[0-9]
[[:lower:]]:表示小寫字母,相當于[a-z]
[[:upper:]]:表示大寫字母,相當于[A-Z]
[[:space:]]:表示任何會產生空白的字符,如空格鍵、tab鍵等
[[:punct:]]:表示標點符號
[[:alpha:]] :表示任何大小寫字母,相當于[a-zA-Z]
[[:alnum:]]:表示任何大小寫字母和數字,相當于[0-9a-zA-Z]
[^]:匹配指定范圍外的任意單個字符
r[^[:lower:]]t:表示以r開頭,中間包含一位非小寫字母并以t結尾的字符串
次數匹配:用于實現指定其前面的字所能夠出現的次數
*:任意長度,前面的字符可以出現任意次
r*t:其中r*表示可以為空字符或一個連續r以上的字符;
如果需要至少兩個r以上的字符串時,使用rrr*來表示
同理需要至少三個r以上的字符串時,使用rrrr*來表示
\?:匹配其前面的字符一次或0次,它前面的字符是可有可無的,其中\為轉義字符
rr\?t:表示以r開頭,中間有一個或者為空字符并且以t結尾的字符串
\{m\}:m次,它前面的字符要出現m次
r\{2\}:表示包含兩個連續r的字符串
\{m,n\}:匹配其前面的字符至少m次,至多n次
r\{2,4\}t:表示包含2至4個連續r,并且以t結尾的字符串
\{m,\}:最少匹配其前面的字符m次
r\{5\}:表示最小出現5個連續的r并且以t結尾的字符串
\{0,n\}:最多匹配其前面的字符n次
r\{0,5\}:表示最多出現5個連續的r并且為t結尾的字符串
注:結果中出現了上面所示的行,是因為沒有限定條件不嚴格造成的,可以定義字符串首部來得到精確結果
.*:任意長度的任意字符
r.*t:表示r與t之間為任意字符(包括空字符)的字符串
位置錨定:用于定義字符位置的元字符
^:錨定行首,此字符后面的任意內容出現在行首。
查找以r開頭t結尾的4個字符的字符串開頭的行
$:錨定行尾,此字符前面的任意內容出現在行尾
查找以n結尾的行
^$:空白行
\<或\b:其后面的任意字符必須作為單詞首部出現
包含以op開頭的單詞的行
\>或\b:其前面的任意字符必須作為單詞尾部出現
包含以ot結尾的單詞的行
可以將兩個符號結合使用,精確查找單詞
分組:
\( \):把內容分組,括號中的字符將被看作是一個整體進行操作
分組中的模式匹配到的內容,可由正則表達式引擎記憶在內存中,之后可被引用
例如:當我們想要查找一個文件中包含至少1個ab的行
新建一個文件eg
引用:
\#:引用第#個括號所匹配到的內容,而非模式本身
例如:
新建一個文件eg1,內容如下:
使用分組得到以下結果
下面使用引用來查找對應的行
表達式中的括號是有編號的,從最左邊的左括號開始計算,編號從1開始,上面的表達式中有兩個左括號,edu前面的為編號1,qa前面的為編號2;而與左括號相對應的右括號則是從里向外就近匹配,上面的表達式中編號為2的表達式為\(qa[[:digit:]]\),編號為1的表達式為\(edc[0-9]\{3\}\(qa[[:digit:]]\)\);
\1表示如果在行中有匹配編號為1的表達式的結果,并且在本行再次出現此表達式的結果時,則此行被選中;如上圖的查詢結果中1號表達式的結果為”edc123qa7“,而后面又出現了一次此字符串,所以該行被選中;\2則引用2號表達式的結果進行匹配查找,2號表達式的結果為”qa7″,所以結果中列出了再次出現”qa7″字符串的行。
擴展正則表達式:
字符匹配:與基本正則表達式相同
. :匹配任意單個字符
[ ]:匹配指定范圍內的任意單個字符
[^]:匹配指定范圍外的任意單個字符
次數匹配:無需轉義字符
*:任意長度,前面的字符可以出現任意次
?:匹配前面的字符0或1次
+:至少1次= \{1,\}
{m}:精確匹配m次
{m,n}:至少m次,至多n次
錨定:與基本正則表達式相同,詞首與詞尾錨定依然需要轉義
分組:與基本正則表達式相同,無需轉義
():無需轉義
引用:\1,\2,\3 …
或者:
a|b:a或者b
使用擴展正則表達式完成上面的引用查詢
原創文章,作者:petmaster,如若轉載,請注明出處:http://www.www58058.com/768