《Linux Shell》笔记之正则表达式

前端之家收集整理的这篇文章主要介绍了《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,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,abbbc……
  • a.*c   a和c之间匹配0个或多个字符,即 ac,adc,accccc …….
  • a.c    a和c之间匹配单个字符,即 acc,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,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,manman,womanwoman

参考书籍:linux shell 从入门到精通

猜你在找的正则表达式相关文章