Linux系統學習之正規表示式

2021-09-20 01:33:26 字數 4692 閱讀 8926

一、基礎的正規表示式

1."."(乙個點)符號

點符號用於u匹配除換行符號之外的任意乙個字元。例如:r.t可以匹配rot、rut,但是不能匹配root,但如果使用r..t,就可以匹配root、ruut、r  t(中間是兩個空格)等。

2.「*」符號

"*"號用於匹配前乙個字元0次或任意多次,比如ab*,可以匹配a、ab、abb等。"*"號經常和"."符號加在一起使用。比如".*"代表任意長度的不包含換行的字元。

3.「"符號

雖然"*"可用於重複匹配前乙個字元,但卻不能精確地控制匹配的重複次數,使用"\"符號則能更加靈活地控制字元的重複次數,典型的有以下三種形式:

\ 匹配前面的字元n次。下列匹配的是包含root的行(r和t中包含兩個o)

[root@cfhost-170820-ucnk ~]# grep 'ro\t' /etc/passwd

root:x:0:0:root:/root:/bin/bash

operator:x:11:0:operator:/root:/sbin/nologin

\匹配前面的字元至少n次以上(含n次)

[root@cfhost-170820-ucnk ~]# grep 'ro\t' /etc/passwd

root:x:0:0:root:/root:/bin/bash

operator:x:11:0:operator:/root:/sbin/nologin

vcsa:x:69:69:virtual console memory owner:/dev:/sbin/nologin

\匹配前面的字元n到m次

4."^"這個符號位於數字鍵盤6的上面,又稱尖角號。這個符號用於匹配開頭的字元。比如說"^root" 匹配的是以字母root開始的行

[root@cfhost-170820-ucnk ~]# grep '^root' /etc/passwd

root:x:0:0:root:/root:/bin/bash

5.「$"符號

和上面的尖角號相對,「$"用於匹配尾部,比如說"abc$"代表的是以abc結尾的行。如果是"^$"則代表該行為空,因為^和$間什麼都沒有。下例匹配的是以r開頭,中間有一串任意字元,以h結尾

[root@cfhost-170820-ucnk ~]# grep '^r.*h$' /etc/passwd

root:x:0:0:root:/root:/bin/bash

6.""符號

這是一對方括號,用於匹配方括號出現的任一字元。比如說單選題的答案,可能是abcd選項中的任意乙個,正規表示式表示的就是[abcd].如果遇到比較大範圍的匹配,比如說要匹配任意乙個大寫字元,就需要使用"-"號做範圍限定,寫成[a-z],要匹配所有字母則寫成[a-za-z].一定要注意,這裡的」-「的作用不是充當乙個字元。

如果是要匹配不是大寫字母a、b、c、d的字元又該怎麼寫?還記得上面的"^"號嗎?如果這個符號出現在中,則代表取反,也就是不是的意思。那這裡的寫法就是[^a-d],事情變得有點複雜了。

這裡舉個例子,看如何匹配手機號。手機號是11位連續的數字,第一位一定是1,所有表示"^1";第二位有可能是3(移動)或8(聯通),表示為"[38]";後面連續9個任意數字,表示為

"[0-9]\";所以整個表示式應該寫為"^[38][0-9]\"

7."\"符號|

假設有乙個固定**號碼021-88888888,當然也可以寫成 021 88888888(區號和**號碼之間用空格隔開),它們的不同之處就是區號和**號碼之間使用的符號不同,乙個是

「-」,乙個是空格。那麼,對於這個**號碼要怎麼匹配呢?很容易地想起應該使用""來匹配。但是這麼寫:[-]是不對的,因為"-"放到""中有特別含義。為了表示其作為乙個字元的本意,就要使用"\"符了,這個符號代表轉義字元,我們可以對很多特殊的字元進行「轉義」,讓它只代表字元本身,因此這裡的寫法就是[\ \-].

再舉個例子,之前我們了解到".*"代表的是任意長度的不包括換行的重複字元。但是如果想要匹配任意長度的點號呢?這時我們用轉義字元就對了:「\.*"。如果想要對」\"符號進行轉義,就可以這樣寫:「\\"。

8."\<"符號和"\>"符號

這兩個符號分別用於界定單詞的左邊界和右邊界。birushuo"\"則用於匹配以"hello"結尾的單詞。還可以2使用它們的組合「\<\>"用於精確匹配乙個字串。所以」\"可精確匹配單詞"hello",而不是helloworld等。如下所示:

[root@cfhost-170820-ucnk ~]# echo "hello" | grep '\'

hello

[root@cfhost-170820-ucnk ~]# echo "hellod" | grep '\'

#//沒有輸出,表示匹配不成功

9.」\d"符號

匹配乙個數字,等價於[0-9],使用grep匹配這種正規表示式時,可能會遇到無法匹配的問題,示例如下:

[root@cfhost-170820-ucnk ~]# echo 123 | grep [0-9]

123[root@cfhost-170820-ucnk ~]# echo 123 | grep '\d'

#沒有輸出,表示匹配不成功,為什麼呢?

#這是因為"\d"是一種per1相容模式的表示式,又稱作pcre,要想使用這種模式的匹配符,需要加上-p引數

[root@cfhost-170820-ucnk ~]# echo 123 | grep -p '\d'

123

10.「b"符號

匹配單詞的邊界,比如"\bhello\b"可精確匹配"hello"單詞

[root@cfhost-170820-ucnk ~]# echo "hello world" |grep '\bhello\b'

hello world

[root@cfhost-170820-ucnk ~]# echo "helloworld" |grep '\bhello\b'

#這裡沒有匹配

11."\b"符號

匹配非單詞的邊界,比如hello\b可以匹配"helloworld「中的"hello"

[root@cfhost-170820-ucnk ~]# echo "helloworld" |grep 'hello\b'

helloworld

12."\w"符號

匹配字母、數字、下劃線,等價於[a-za-z0-9]

[root@cfhost-170820-ucnk ~]# echo "a" | grep '\w'

a[root@cfhost-170820-ucnk ~]# echo "\\" | grep '\w'

14."\n"符號

匹配乙個換行符

15.」\r"符號

匹配乙個回車符

16."\t"符號

匹配乙個製表符

17."\f"符號

匹配乙個換頁符

18."\s"符號

匹配任何空白字元

19."\s"符號

匹配任何非空白字元

二、擴充套件的正規表示式

「?」符號

"?"符號用於匹配前乙個字元0次或1次,所以"ro?t"僅能匹配rot或rt

「+」符號

"+"符號用於匹配前乙個字元1次以上,所以"ro+t"就可以匹配rot、root等

"|"符號

"|" 符號是"或"的意思,即多種可能的羅列,彼此間是一種分支關係。比如說有些地區固定**的區號是4位數,有些地方卻是3位數,這樣針對不同的區號就有不同的固定**的表示如:

#區號是3位的固定**的正規表示式方式

^0[0-9]\-[0-9]\

#區號是4位的固定**的正規表示式方式

^0[0-9]\-[0-9]\

#兩種區號的固定**號碼可以如下寫:

^0[0-9]\-[0-9]\

#使用"|"符號業可以,但是顯然比上面的方式麻煩

^0[0-9]\-[0-9]\|^0[0-9]\-[0-9]\

#"()"符號

"()符號通常需要和"|"符號聯合使用,用於列舉一系列可替換的字元。比如說固定**的區號和**號碼之間,可能用"-"符號或者用乙個空格連線,用於匹配的正規表示式如下:

^0[0-9]\(-1)[0-9]\

^0[0-9]\[\ \-] [0-9]\

雖然以上兩種寫法沒有本質的不同,因為"()"和"|"可以和""相互混用,但是在某些場景下,"()"和"|"可以做的更多,比如說像hard、hold或hood等這類開頭和結尾的字母都一樣的單詞,要匹配這些就必須使用"()"和"|"了。如下所示:

h(ar|oo|ol)d

三、萬用字元

實際上,萬用字元是一種特殊的語句·1,主要包含"*"號和"?"號(還有"{}"、「^"、」!「)。主要用來模糊搜尋檔案,使用它來代替乙個或多個真正的字元,尤其是在不知道或者不確定完整的檔名時,用來匹配符合條件的檔案。

」*「符號:

這裡的*就是提到的第乙個萬用字元,代表0個或多個字元。

」?「符號

如果要列出以字母a開頭、但是只有兩個字母的檔名、以.doc結尾的檔案,就需要使用"?"了。當它作為萬用字元使用時,代表的是任意乙個字元。

」{}"符號:

"{}"可擁有匹配所有括號內包含的以逗號隔開的字元。

Linux系統之正規表示式

正規表示式 概述 正規表示式是由一系列字元和元字元構成的字串,簡稱re regular expression 主要功能書文字查詢和字串操作,他可以匹配文字的乙個字元或字元集合。正規表示式完成了資料的過濾,將不符合正則表達是的資料拒絕,留下符合的 字元匹配 匹配任意單個字元 匹配指定範圍內任意單個字元...

Linux學習之正規表示式

正規表示式用於查詢,替換等字串處理。grep用於整個資訊的抓取,sed以行為單位處理,awk以列為單位處理 grep n the filename.txt 搜尋字串the,並顯示行號 grep vn the filename.txt 搜尋不包含字串the,並顯示行號 grep n t ae st f...

Linux之正規表示式

正規表示式用來在檔案中匹配符合條件的字串,正則是包含匹配。grep awk,sed等命令可以運動正規表示式。正規表示式匹配得到的結果是行 萬用字元用來匹配符合條件的檔名,萬用字元是完全匹配。ls.find.cp這些命令不支援正規表示式,所以只能用shell自己的萬用字元來進行匹配了。例 grep a...