《Linux Shell》筆記之正則表達式


 

  1. 正則表達式概念 

正則表達式的文法分為3種標准:BRE、ERE 和 ARE。其中 BER 和 ERE 屬於 POSIX 標准,ARE 則是由各家定義的擴展

BRE:基本正則表達式

ERE:在BRE基礎上,擴展正則表達式

什么是POSIX呢,POSIX Portable Operating System Interface 可移植操作系統接口,  (BRE, ERE)的應用。

正則表達式的基本字符匹配:特殊字符(meta character 元字符)和一般字符。

什么是元字符:特殊意義的專用字符(如"*","+","?","."等),用一個或者一組元字符代替一個或多個字符。舉個例子: 元字符*用來匹配0個或多個的前一字符;而元字符. 用來匹配一個任意的一個字符

什么是一般字符:原義正常文本字符(非元字符),例如:'*grep' 匹配所有一個或多個任意字符后緊跟grep,grep就是一般字符。

 

 

  1. 常見linux命令及他們默認使用的正則表達式類型

    

       grep

        sed

           vi

    egrep

       awk

BRE

*

*

*

 

 

ERE

 

 

 

*

*

 

  • grep: 加上-E,開啟ERE模式

 

 

  1. BRE和ERE 都支持的元字符

字符

BRE/ERE

模式含義

^

BRE,ERE

行或字符串的開始;如:'^abcd' 匹配所有以abcd開頭的行

$

BRE,ERE

行或字符串的結束,如:'abcd$' 匹配以abcd結尾的行

.

BRE,ERE

匹配一個非換行符的字符 (1);

如:'a.b' 匹配a后接一個任意字符,然后是b,將匹配 aAb, a1b, acb, a@b等

 

如: '.b' 匹配 ab,1b,@b …等

*

BRE,ERE

匹配零個或多個正則表達式前面的字符 (0-n)

如:'ac*d' 匹配a后接零個或多個前面的字符,將匹配:ad, acd, accd, acccd …等

 

注意:星號不能放在首位, 星號前面必須有單個字符,經常我們使用 .*表示任意數目字符,但不能直接把星號放在首位如 '*d'

[…]

BRE,ERE

匹配方括號內任意一個字符(1);

如:"[Ab]cde" 匹配Abcd和abcd


連字符(-) 表示連續字符的范圍;

如:"[0-9]abc"匹配abc前面的任意一個數字:0abc, 1abc, 2abc, 012abcd, 0123abcd ……

 

[a-z] 123 匹配123前面的任意一個小寫母如:a123, b123, ab123, abc123

[A-Z] 123 匹配123前面的任意一個大寫母如:A123, B123, AB123, ABC123

[a-zA-Z0-9]表示匹配任意一個數字和大小寫英文字母;

[a-bA-Z0-9!]表示所有的大小寫字母,數字和感嘆號;

其它的形式有:[A-Z],[AB-Z],[A-YZ],[AB-YZ],[A-DE-Z]

不支持形式有:[A-D-Z],[AB-D-Z],[A-D-YZ]

 

如果^符號位於方括號的開始,則具有相反含義:不匹配方括號中的任意字符。

如:'[^A-FH-Z]rep' 匹配不包含A-R和T-Z的一個字母開頭,緊跟rep的行;或者[^A-Z]rep

 

\

BRE,ERE

通常用於關閉其后續字符的特殊意義,恢復其原意。

如:\(...\),這里的括號僅僅表示括號。


4. BRE ERE支持不同的元字符

字符

BRE

模式含義

\(\)

BRE

將圓括號之間的模式存儲在特殊“保留空間”。最多可以將9個獨立的子模式存儲在單個模式中。匹配於子模式的文本,可以通過轉義序列\1到\9,被重復使用在相同模式里。

 

如'\(abc\).*\1' 匹配兩個abc中間帶有任意數目的字符,第二個abc使用\1來引用。最多可以保存9個獨立的模式,即從\1到\9;  簡單說:將abc放在保留空間,使用\1引用abc;

注意:必須使用 .*

 

\(ab\).*\1 匹配: abab,ab1ab1, ab12ab1, ab123ab1….等

\(ab\).*\1.*\(de\).*\2 匹配ab1ab1def1de1, ab12ab12de12de1….等

\n

BRE

重復在\內的第n個模式。n為1到9,n是數字. 

x\{m, n\}

BRE

匹配x字符出現的次數區間。x\{n\}是指x出現n次;x\{m,\}是指x出現至少m次;x\{m,n\}指x至少出現m次,至多出現n次. 

 

如:ab\{2\}匹配abb;ab\{2,\}表示abb、abbb等。ab\{2,4\}表示abb、abbb和abbbb。

x{m, n}

ERE

其功能等同於上面的\{n,m\},只是不再寫\轉義符了。

匹配x字符出現的次數區間。x\{n\}是指x出現n次;x\{m,\}是指x出現至少m次;x\{m,n\}指x至少出現m次,至多出現n次. 

  

m表示最小值,n表示最大值

如:ab{2}匹配abb;ab{2,}表示abb、abbb等。ab{2,4}表示abb、abbb和abbbb。

+

ERE

與*相比,匹配前面正則表達式的一個或多個實例 (1-n)

 

如:ab+c 匹配abc,abbc,abbbc ….等

?

ERE

匹配前面正則表達式的零個或一個實例 (0-1)

如:ab?c 匹配ac, abc

|

ERE

匹配|前面或后面的正則表達式

如:'ab|cd'匹配ab, cd, abcd

()

ERE

匹配用括號括起來的正則表達式群; 如:參見11的分組例子

 

  1. grep 程序支持的元字符plus

字符

模式含義

\<

單詞的開始,如:'\<ab' 匹配包含以ab開頭的單詞的行

\>

單詞的結束,如:'ab\>'匹配包含以ab結尾的單詞的行

 

如:匹配單詞開頭+word+結尾

test@sha> echo this is a word. |grep '\<word\>'

this is a word.

\w

匹配文字和數字字符,也就是[A-Za-z0-9]

如:'G\w*p' 匹配以G后跟零個或多個文字或數字字符,然后是P ;'G\w*p' 匹配 G123456abp

\W

\w的反置形式,匹配一個或多個非單詞字符,如點號,句號等

如:'G\W*p' 匹配G...:p

\b

單詞鎖定符

如:'\bhello\b'只匹配hello

如:''er\b'' 可以匹配"never" 中的''er'',但不能匹配 "verb"中的 ''er''。

awk使用\y表示此功能

\B

正則表達式之后或者之前不能是空格

 

如: ''er\B''能匹配"verb"中的''er'',但不能匹配"never"中的 ''er''  (er是結束位置,不能匹配)

\`\`

分別匹配緩沖區的開頭和結尾。通常視為^和$同義

 

實例:

test@sha>cat aa.regular

aatestaa

west123es123

test@sha>cat bb.regular

bbtestbb

test@sha>cat cc.regular

cctestcc

 

test@sha>ls -l |grep '\<aa'  #列出以aa開頭的文件

test@sha>grep 'test' c*   #顯示以c開頭的文件中包含test的行

Cctestcc

 

test@sha>grep 'test' a* b* c* #顯示以a,b,c開頭的文件中包含的test的行

aa.regular:aatestaa

bb.regular:bbtestbb

cc.regular:cctestcc

 

test@sha>grep '[a-z]\{5\}' a* #顯示以a開頭的文件中,至少有5個連續小寫字母的字符串的行

aatestaa

 

test@sha>grep 'w\(es\)t.*\1' a* #顯示以a開頭的文件中,包含west並且重復出現過一次es

west123es123

 

  1. 特殊字符類 (為了在不同國家的字符編碼保持一致)

6.1 POSIX 字符集

 

模式含義

[::alnum]

匹配文本和數字字符,等效於A-Za-z0-9 

如:ab[[::alnum]] 匹配abc,ab1

[:alpha:]

匹配文字字符;

如:ab[[:alpha:]] 匹配abc

[:blank:]

匹配空格space與定位tab字符

[:cntrl:]

匹配控制字符

[:digit:]

匹配數字字符

[:graph:]

匹配非空格字符

[:lower:]

匹配小寫字母字符

[:print:]

匹配非空字符(包括空格)

[:punct:]

匹配標點符號字符

[:space:]

匹配空格字符 (新行,空格,制表符)

[:upper:]

匹配大寫字母字符

[:xdigit:]

匹配16進制數字

 

實例:#匹配一個或多個數字字符或下划線"_"

test@sha>echo this num is 123_456 |grep -E '[[:digit:]_]+'

this num is123_456

test@sha>echo this num is 123456 |grep -E '[[:digit:]_]+'

this num is123456

test@sha>echo this num is _ |grep -E '[[:digit:]_]+'

this num is _

 

- 此外,還有以下特殊字符類:

perl類 等效POSIX表達式 描述

----------------------------------------------------------------------------

\o [0-7]

八進制數字

\O [^0-7]

非八進制數字

\w [[:alnum:]_]

單詞構成字符

\W [^[:alnum:]_]

非單詞構成字符

\A [^[:alpha:]]

非字母

\L [^[:lower:]]

非小寫字母

\U [^[:upper:]]

非大寫字母

\S [^[:space:]]

非空格符

\D [^[:digit:]]

非數字

\X [^[:xdigit:]]

非十六進制數字

\P [^[:print:]]

非可打印字符

- 還可以使用以下特殊字符換碼序列:

\r

回車

\n

換行

\b

退格

\t

制表符

\v

垂直制表符

\"

雙引號

\'

單引號

 

6.2 排序符號

多個字符序列視為一個元素,它使用[.和.]將字符組合括起來。例如,[.cn.]就表示cn字符序列,而單獨的c或n都不行

 

 

6.3 等價字符集

等價字符集表示應視為等值的一族字符,使用[=和=]將字符括起來。例如,e和ê,在法語的local 里,"[[=e=]]" 可能匹配於e/é/è/ê

 

 

  1. 單個字符匹配

7.1 一般字符

 

7.2 轉移meta字符

例如:\.就真表示一個點;\[左方括號;\\表示反斜杠

 

7.3 . (點號)字符

".hina"表示"任一字符";很少單獨使用,多與其他字符混合匹配多個字符

 

7.4 方括號表達式

例如:

[cC]hina匹配china 和China;

[^abd]hina匹配除了abd 3個小字母外的任意字母,加上hina.(包括:所有大寫字母,數字,標點符號等)
[a-zA-Z0-9]hina, 匹配[a-z],[A-Z],[0-9]加上hina

 

 

  1. 單個表達式匹配多個字符

8.1 星號字符的應用

  • ab*c    ab和c之間匹配0個或多個字符, 即ac,abc,abbc,abbbc……
  • a.*c   a和c之間匹配0個或多個字符 , 即 ac, abc, adc, abbc, accccc …….
  • a.c    a和c之間匹配單個字符, 即 acc, abc, aac, a!c等

 

8.2 區間表達式的應用

  • ab\{3\}c           a和c之間的b字母重現3次,即 abbbc
  • ab\{3,\}c          a和c之間的b重現至少3次,即 abbbc, abbbbc
  • ab\{3,5\}          a和c之間的b字母重現3次到5次,即abbbc, abbbbc, abbbbbc
  • a\{5\}    a重現5次
  • b\{7,10\}         b重現7次到10次

8.3 匹配多個字符實例

  • ab?c           即ac和abc
  • ab+c              即abc, abbc, abbbc…..但是不匹配ac

+字符的概念和*有點相似,但是+字符要求前置正則表達式至少出現一次

 

  1. 文本匹配錨點

 

實例:

字符串:   abcxxxABCabcxxxefg

^abc  匹配字符串開頭的3個字母abc, 例如 abcxxxABCabcxxxefg

^ABC 匹配字符串開頭的ABC

efg$ 匹配結尾處的efg ,$表示結尾,即abcxxxABCabcxxxefg

^$ 匹配空的字符串或者空行

 

 

  1. 運算符優先級

BRE運算優先級

運算符

含義

[..] [==][::]

方括號符號

\meta

轉義的meta字符

[]

方括號表達式

\(\)\n

后向應用表達式

*\{\}

區間表達式和星號表達式

無符號

連續

^$

錨點

 

  1. ERE中的運算優先級

運算符

含義

[..][==][::]

方括號符號 

\meta

轉移的meta字符

[]

方括號表達式

()

分組

*+? {}

重復前置的正則表達式

無符號

連續

^$

錨點 (匹配空行)

|

交替

 

11.更多差異 (后向引用,分組,交替)

 

11.1 后向引用 (BRE)

使用\(和\) 括起想要之后引用的部分,使用\1-\9引用之前選定的部分

 

例如: \(ab\)\(cd\)[efg]*\1\2 

ab被括起來,之后使用\1引用;cd被括起來,之后使用\2引用;
[efg]* 表示:e或f或g,或空;

 

匹配的一些字符串是: abcdabcd, abcdeabcd, abcdfabcd, abcdgabcd

 

例如:\(go\).*\1

匹配的一些字符串是: gogo,go1go, go12go, go123go….等

 

11.2 交替 (ERE)

例如:you|me 匹配you 或者me

 

11.3 分組 (ERE)

匹配重復情況;如:(go)+匹配一個或者多個連續的go

例子:

man|woman+    匹配字符串: man, woman, womann, womannn

(man|woman)+  匹配字符串:man,woman, manman,womanwoman

 

 

參考書籍:linux shell 從入門到精通



注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2021 ITdaan.com