當(dāng)前位置:首頁(yè) > IT技術(shù) > 系統(tǒng)服務(wù) > 正文

【Linux】Linux中正則表達(dá)式
2021-09-09 13:55:53

當(dāng)從一個(gè)文件或命令輸出中抽取或過(guò)濾文本時(shí),可以使用正則表達(dá)式。

?

以下是在基本命令中使用正則表達(dá)式的一些定義及用法

?

基本元字符集及其含義

^

匹配行首

$

匹配行尾

.

匹配任意單個(gè)字符

*

字符*???匹配0或多個(gè)此字符

/

屏蔽一個(gè)元字符的特殊含義

[]

匹配中括號(hào)中出現(xiàn)的字符,可以是單字符或字符序列,可以使用–表范圍

Pattern/{n/}

匹配其那面patern出現(xiàn)的次數(shù),n為次數(shù)

Pattern/{n,/}

至少出現(xiàn)n次

Pattern/{n,m/}

n<=次數(shù)?<=m

?

使用例子:

1.??????匹配任一單個(gè)字符

句點(diǎn)允許匹配ASCII集中任一字符,或?yàn)樽帜富驗(yàn)閿?shù)字

b.g???->?big??bag beg?等

2.??????在行首以^匹配字符串或序列

只允許在一行的開(kāi)始匹配字符或單詞

$ls –l | grep ^d????????????匹配文件夾

^001????開(kāi)頭為001的

3.??????在行尾以$匹配字符串或序列

ld$?以ld結(jié)尾

^$?匹配所有空行

^.$只包含一個(gè)字符的

4.??????使用*匹配字符串中單字符或其重復(fù)序列

Compu*t??匹配u重復(fù)0或多次

5.??????使用/屏蔽一些特殊字符

特殊?$?.??‘??“??*??[??]?^?|??(??)??/??+???

/.匹配句點(diǎn)

/*/.pass?匹配*.pass

6.??????使用[]匹配一個(gè)范圍或集合

匹配特定字符串,字符串集?可用逗號(hào)分隔

數(shù)字:[0123456789]??[0-9]

小寫(xiě)字母: [a-z]

所有字母:[A-Za-z]

字母和數(shù)字: [A-Za-z0-9]

所有單詞:[A-Za-z]*

[Cc]omputer?匹配Computer或computer

注意:在[]中,^代表否定

?????非字母:[^A-Za-z]

?????非數(shù)字:[^0-9]

7.??????使用/{/}匹配模式結(jié)果出現(xiàn)的次數(shù)

A/{2/}B??匹配AAB

A/{4,/}B??匹配A出現(xiàn)至少4次B

A/{2,4/}B?匹配A出現(xiàn)在2至4次之間

?

??

正則表達(dá)式

熱身

正則表達(dá)式(regular?expression)描述了一種字符串匹配的模式,可以用來(lái)檢查一個(gè)串是否含有某種子串、將匹配的子串做替換或者從某個(gè)串中取出符合某個(gè)條件的子串等。

例如?grep,?expr,?sed?,?awk.?或Vi中經(jīng)常會(huì)使用到正則表達(dá)式,為了充分發(fā)揮?shell?編程的威力,需要精通正則表達(dá)式。

?

?

【Linux】Linux中正則表達(dá)式_Linux基本命令【Linux】Linux中正則表達(dá)式_Linux命令_02

【Linux】Linux中正則表達(dá)式_Linux中正則表達(dá)式_03

【Linux】Linux中正則表達(dá)式_正則表達(dá)式_04

【Linux】Linux中正則表達(dá)式_字符串_05

ls?-l?|grep?"^d"

這條簡(jiǎn)單的命令就輕松解決了我們的問(wèn)題,。"^d"???你納悶了,這個(gè)小東西配合起來(lái)怎么會(huì)有那么大的威力呢?這好比玩三國(guó)殺時(shí)劉備、司馬懿、香香之間配合的威力……"^d",就是正則表達(dá)式的用法,"^"表示匹配行首,"^d"合起來(lái)就表示以d開(kāi)頭的一行,grep?"^d"?就是過(guò)濾出以d開(kāi)頭的那些行,d?表示目錄,也就過(guò)濾出了當(dāng)前目錄中的所有目錄。

謎底解開(kāi)。現(xiàn)在你又想到,前面不是說(shuō)還有一種方法的么,既然如此迫不及待,那就只好順?biāo)浦哿恕?/p>

【Linux】Linux中正則表達(dá)式_Linux基本命令_06

【Linux】Linux中正則表達(dá)式_正則表達(dá)式_07

?

【Linux】Linux中正則表達(dá)式_Linux中正則表達(dá)式_08

ls?-F?|?grep?"/$"?

這條短命令又一切成全了我們的夢(mèng)想。"/$"?也是正則表達(dá)式的用法,"$"表示匹配行尾,"/$"合起來(lái)就表示匹配以/結(jié)尾的行,grep?"/$"?就是過(guò)濾出以/結(jié)尾的那些行,/表示目錄,也就過(guò)濾出了當(dāng)前目錄中的所有目錄。

在此基礎(chǔ)上,我們發(fā)散一下思維,比如說(shuō)想統(tǒng)計(jì)當(dāng)前目錄下的文件個(gè)數(shù)及目錄個(gè)數(shù),就可以使用以下命令:

ls?-l?*?|grep?"^-"|wc?-l?

ls?-l?*?|grep?"^d"|wc?-l?

好了,暫且休息,下面我們開(kāi)始介紹更多關(guān)于正則表達(dá)式的知識(shí)。

蓄勢(shì)

前面我們初識(shí)了^?$?*?這些個(gè)正則表達(dá)式的用法,下面我們將進(jìn)行更高一級(jí)的升煉。

正則表達(dá)式是一個(gè)字符或和元字符組合成的字符集,它們匹配(或指定)一個(gè)模式。字符即普通字符(例如字符?a?到?z),元字符即特殊字符(例如前面提到的字符?^?$?*)。正則表達(dá)式作為一個(gè)模板,將某個(gè)字符模式與所搜索的字符串進(jìn)行匹配。

在這里,為簡(jiǎn)單見(jiàn),我們不會(huì)介紹所有的正則表達(dá)式知識(shí),只介紹常用的一些正則表達(dá)式知識(shí)。

一個(gè)正則表達(dá)式包含下面一個(gè)或多個(gè)項(xiàng):

1.一個(gè)字符集

這里的字符集里的字符表示的就是它們字面上的意思.正則表達(dá)式最簡(jiǎn)單的情況就是僅僅由字符集組成,而沒(méi)有其他的元字符。

2.錨

一個(gè)錨指明了正則表達(dá)式在一行文本中要匹配的位置,例如^和$就是錨。

3.修飾符

它們用于展開(kāi)或縮小(即是修改了)正則表達(dá)式匹配文本行的范圍.修飾符包括了星號(hào)、括號(hào)和反斜杠符號(hào)。

* 匹配重復(fù)零次或多次前一字符?

+ 匹配一個(gè)或多個(gè)前面的字符.它的作用和*很相似,但唯一的區(qū)別是它不匹配零個(gè)字?符的情況

? 匹配零或一個(gè)前面的字符。它一般用于匹配單個(gè)字符?

. 匹配任意字符(?除換行符?)?

^ 匹配一行的開(kāi)頭,但依賴于上下文環(huán)境,可能在正則表達(dá)式中表示否定一個(gè)字符?集的意思
[...] 匹配集合中任意字符?如"[xyz]"?匹配字符?x,?y,?或z
[^...] 匹配不屬集合?中?任意字符?
^,?$ 匹配?行首、行尾?
<,?> 用于表示單詞的邊界。<?匹配詞首,>詞尾,如"<the>"?匹配單詞"the"
(...) 正則表達(dá)式分組。進(jìn)行子字符串提取(substring?extraction)一起使用很有用
第?n?個(gè)分組內(nèi)容??

轉(zhuǎn)義(escapes)?一個(gè)特殊的字符,使這個(gè)字符表示原來(lái)字面上的意思。"$"表示?了原來(lái)的字面意思"$",而不是在正則表達(dá)式中表達(dá)的匹配行尾的意思."\"也被?解釋成了字面上的意思""

{?} 指示前面正則表達(dá)式匹配的次數(shù).?

要轉(zhuǎn)義是因?yàn)椴晦D(zhuǎn)義的話大括號(hào)只是表示他們字面上的意思.這個(gè)用法只是技巧上?的而不是基本正則表達(dá)式的內(nèi)容."[0-9]{5}"?精確匹配5個(gè)數(shù)字(從0到9的數(shù)字).?

| "或",正則操作符用于匹配一組可選的字符

{n} n是一個(gè)非負(fù)整數(shù)。匹配確定的n次。例如,''o{2}''?不能匹配?"Bob"中的''o'',但是能匹配"food"?中的兩個(gè)o。

{n,} n是一個(gè)非負(fù)整數(shù)。至少匹配n次。例如,''o{2,}''?不能匹配"Bob"中的'o'',但能匹配?"foooood"中的所有o。''o{1,}''等價(jià)于''o+''。''o{0,}''則等價(jià)于''o*''。

{n,m} m和n均為非負(fù)整數(shù),其中n<=m。最少匹配n次且最多匹配m次。例如,"o{1,3}"將匹配?"fooooood"中的前三個(gè)o。''o{0,1}''等價(jià)于''o?''。請(qǐng)注意在逗號(hào)和兩個(gè)數(shù)之間不能有空格。

 匹配一個(gè)單詞邊界,也就是指單詞和空格間的位置。例如,''er''?可以匹配"never"?中的''er'',但不能匹配?"verb"中的?''er''。?

B 匹配非單詞邊界。''erB''能匹配"verb"中的''er'',但不能匹配"never"中的?''er''

w 匹配包括下劃線的任何單詞字符。等價(jià)于''[A-Za-z0-9_]''。

W 匹配任何非單詞字符。等價(jià)于''[^A-Za-z0-9_]''。

d 匹配一個(gè)數(shù)字字符。等價(jià)于[0-9]。

D 匹配一個(gè)非數(shù)字字符。等價(jià)于[^0-9]。

f 匹配一個(gè)換頁(yè)符。等價(jià)于x0c和cL。

匹配一個(gè)換行符。等價(jià)于x0a和cJ。

匹配一個(gè)回車符。等價(jià)于x0d和cM。

s 匹配任何空白字符,包括空格、制表符、換頁(yè)符等等。等價(jià)于[f v]。

S 匹配任何非空白字符。等價(jià)于[^f v]。

匹配一個(gè)制表符。等價(jià)于x09?和?cI。

v 匹配一個(gè)垂直制表符。等價(jià)于x0b和cK。

常用的就介紹到這里,其它的需要進(jìn)一步了解可以查閱手冊(cè)或資料。

轉(zhuǎn)載請(qǐng)標(biāo)明: javascript:void(0)

?

翱翔

部分例子?

/([a-z]+)1/gi 一個(gè)單詞連續(xù)出現(xiàn)的位置?

/(w+)://([^/:]+)(:d*)?([^#?]*)/ 將一個(gè)URL解析為協(xié)議、域、端口及相對(duì)路徑

/^(?:Chapter|Section)?[1-9][0-9]{0,1}$/定位章節(jié)的位置?

/[-a-z]/ A至z共26個(gè)字母再加一個(gè)-號(hào)。

/ter/ 可匹配chapter,而不能terminal

/Bapt/ 可匹配chapter,而不能aptitude

/Windows(?=95?|98?|NT?)/ 可匹配Windows95或Windows98或WindowsNT,當(dāng)找到一個(gè)匹配后,從Windows后面開(kāi)始進(jìn)行下一次的檢索匹配。

下面來(lái)些更加高級(jí)些的例子。

對(duì)于vi?中命令的分析

s/(^.*$) ^.*$/1/g

初一看,會(huì)傻眼,眼前感覺(jué)全是$^.*/……這些符號(hào)的閃動(dòng)。

不要緊,下面慢慢道來(lái)。

先給出vi中替換命令的格式。

s/re/string? 用string替換正則表達(dá)式re

如果在后面加了個(gè)g?如:?s/re/string/g

表示表示對(duì)該行內(nèi)符合模式的進(jìn)行全部替換。

例如,s///_/g?這個(gè)正則表達(dá)式就表示,對(duì)行內(nèi)所有的斜扛(/)替成下劃線(_),?/即替換命令格式中的re,用反斜扛是為了轉(zhuǎn)義,?/即表示?/?的本意;_即替換命令格式中的string。

好了,了解vi中替換命令的格式后,我們?cè)賹?duì)細(xì)節(jié)進(jìn)行分析。

前面介紹到?(...)?表示正則表達(dá)式分組, 表示第?n?個(gè)分組內(nèi)容,于是對(duì)于

s/(^.*$) ^.*$/1/g?

中的?1?,就表示第一個(gè)正則表達(dá)式分組即(^.*$),我們暫將第一個(gè)正則表達(dá)式分組(^.*$)其記為:A

類推,2就應(yīng)該表示第二個(gè)正則表達(dá)式分組,即? ^.*$??實(shí)際上?也應(yīng)該寫(xiě)在括號(hào)內(nèi)比較好:( ^.*$)?,我們也暫將第二個(gè)正則表達(dá)式分組? ^.*$?記為:B

好了,

%s/(^.*$) ^.*$/1/g

就可以寫(xiě)為:

s/AB/A/g

作用就是將行內(nèi)所有的AB都替換成A。

現(xiàn)在我們來(lái)分別分析A和B的作用。

A=(^.*$)

抽取出來(lái)實(shí)際上是(...),表示正則表達(dá)式?分組,再分析括號(hào)內(nèi)的^.*$,^代表行首,點(diǎn)號(hào)(.)匹配任意字符(除換行符),星號(hào)(*)匹配重復(fù)零次或多次前一字符,$代表匹配到行尾,綜合起來(lái)就是:匹配這一行

B= ^.*$

分析:? 換行,^.*$同上,表示匹配這一行,綜合起來(lái)就是:下一行(即上行結(jié)束后開(kāi)始的另一行)。

再于是就有:%s/AB/A/g?即將所有AB都替換成B??,代入A和B各自意思得到:

將兩行(如行1和行2?)內(nèi)容替換為第一行內(nèi)容(即行1的內(nèi)容),加上/g,就是對(duì)全文進(jìn)行前述替換,也就是隔行刪除,如果是從文件第一行開(kāi)始進(jìn)行的操作,就意味著是刪除所有偶數(shù)行、保留所有奇數(shù)行操作。

從上面的分析過(guò)程中,我們總結(jié)出兩條有用的正則表達(dá)式:

%s/(^.*$) ^.*$/1/g 刪除偶數(shù)行

%s/^.*$ (^.*$)/1/g 刪除奇數(shù)行

不過(guò)癮的話,還可以再看看另一例子:

sed?'s/(.*)(.)$/2/'

2就應(yīng)該表示第二個(gè)正則表達(dá)式分組

同上,也將A=/(.*),B=(.)$,表達(dá)式變?yōu)?#39;s/AB/B',將AB都替換成B?。

分析A、B作用。

A=/(.*)

抽取出來(lái)實(shí)際上是(...),表示正則表達(dá)式?分組,再分析括號(hào)內(nèi)的?.*,表示匹配任意零個(gè)或多個(gè)字符?(?除換行符?)?

B=(.)$

括號(hào)內(nèi)的?.?,表示匹配任意字符(除換行符)?,括號(hào)外的$表示匹配到行尾,即表示行尾的最后一個(gè)字符;那上述的A?/(.*)??就表示該行最后一個(gè)字符前的所有字符。

于是sed?'s/(.*)(.)$/2/'?作用就是:刪除該行除最后一個(gè)字符外的所有字符,保留最后一個(gè)字符,也即取得該行最后一個(gè)字符。

好了,正則表達(dá)式的介紹就告一段落,知識(shí)點(diǎn)比較多,需要平時(shí)反復(fù)的積累,遇到復(fù)雜的正則表達(dá)式時(shí)首先要克服恐懼的心理,然后按照上面的方法化繁為簡(jiǎn),抓住其本質(zhì)的東西,有如探囊取物,必手到擒來(lái)

本文摘自 :https://blog.51cto.com/u

開(kāi)通會(huì)員,享受整站包年服務(wù)立即開(kāi)通 >