您的位置:首页 > 其它

基本正则表达式,扩展的正则表达式详解

2016-03-16 14:48 417 查看

1).简单的grep

grep [option] PATTERM [file...]

               
#grep 'root' /etc/passwd

       
-E:使用扩展正则表达式

       
-F:使用固定字符串进行匹配

       
-l:列出匹配模式的文件名称,而不是打印匹配的行

       
-q:静默模式,匹配grep则成功退出,不匹配则写入标准输出

       
-S:不显示错误信息

       
-i:忽略字符大小写

       
--color:显示颜色

       
        # alias grep='grep --color'

               
# grep  'root' /etc/passwd

       
-v :反向查找,显示没有被模式匹配到的行

       
-o:只显示被模式匹配到的字符串

 

2).基本正则表达式     


meta字符

.:匹配任意单个字符

       
# grep 
'r..t' /etc/passwd

*:匹配其前面的字符任意次

       
a*b b,aab, 
即a出现任意次以后跟一个b

^:锚定行首,此字符后面的任意内容必须出现在行首

       
# grep 
'^r..t' /etc/passwd    

$:锚定行尾,此字符前面的任意内容必须出现在行尾

       
# grep 
'w$' /etc/passwd     

       
# grep  'r..t$' /etc/passwd    

^...$:整个字符串

^$:  
空白行


       
# grep  '^$' /etc/passwd 
查看空白行

       
$ cc -E foo.c | grep -v  '^$' > foo.out

#先使用grep -v显示不匹配的行(即非空白行),重定向到新的文件,从而过滤文件中空白行      

链接:

cc -E
:
这个选项是相对标准的,它允许修改命令行以使编译程序把预先处理的C文件发到标准输出,而不实际编译代码.

在查看C预处理伪指令和C宏时,这是很有用的.可能的编译输出可重新定向到一个文件,然后用编辑程序来分析:

       
$cc -c -E foo.c > foo.out

               
#此命令使include文件和程序被预先处理并重定向到文件foo.out.

#以后可以用编辑程序或者分页命令分析这个文件,并确定最终的C语言代码看起来如何.

 

\{n,m\}:匹配其前单个字符重现的次数区间,n-m次,匹配其前的字符至少n次,至多m次

       
n与m的值必须介于0至RE_DUP_MAX(含)之间

               
$ getconf RE_DUP_MAX 获得值

       
\{n\}:重现n次

       
\(n,\}:至少重现n次

               
\{1,\}  ;至少一次

               
\{0.3\} :至多三次

               
# grep  'a\{1,3\}b' test.txt

                       
ab aab aaab

               
# grep  'a.\{1,3\}b' test.txt

                       
aab acb amnb amnbnnhb

 

练习1:以abcABCdefDEF匹配

               
^ABC 不匹配

               
def 匹配

               
def$ 不匹配

               
[[:upper:]]\{3\} 匹配,居中456ABC匹配

               
[[:upper:]]\{3\}$ 匹配,结尾DEF匹配

               
^[[:alpha:]]\{3\} 匹配,起始abc匹配

       

.*:任意长度的任意字符             


               
# a.*b a开头b结束中间任意

       
贪婪模式:默认情况下正则表达式工作在贪婪模式,尽可能长匹配

 

?:匹配其前面的字符一次或0次

       
部分符合也可以

               
a?b

               
b ,ab ,aab,acb,adb,ammb,annnbnnhbnb

 

|:匹配于|符号前或后的正则表达式

+:匹配前面正则表达式的一个或多个实例

():匹配括号中内容

[.与.]:排序,给予成组的项目排列顺序的操作,

               
如假定[.cd.]存在,则[ab[.cd.]ef]匹配a,b,e,f,以及成对出现的cd

[=与=]:等价字符集,让不同字符集在匹配时视为相同字符集

               
如French的locale下,可能有[=e=]这样的等价字符集,

               
则[Fi[=e=]ld]就等同于所有小写英文字母元音,以及字母è、é等

 

\<或者\b:锚定词首,其后面的任意字符必须作为单词首部出现

\>或者\b:锚定词尾,其前面的任意字符必须作为单词尾部出现            

       
# grep " \<root\>" test.txt

 

后向引用:匹配于正则表达式匹配的先前的部分

①.
将子表达式包围在 \(
和 \)
里,单个模式里最多可包含9个子表达式,且可为嵌套结构

②.在同一个模式之后使用 \digit,
数字digit介于1至9个数字。

       
指的是匹配于第n个先前方括号内子表达式匹配成功的字符       

\(\)
:后向引用


       
\1:引用第一个左括号以及与之对应的右括号所包括的所有内容

               
# grep 
'\(l..e\).*\1' test3.txt 匹配一个或多个l..e

               
# grep  '\([0-9]).*\1$' /etc/passwd      
任意数字
相同数字结尾

       
\(ab\)\(cd\)[def]*\2\1  abcdcdab、 abcdeeecdab、 abceddeefffcdab、....

       
\(why\).*\1 :表示一行里重现两个why

       
\([“ ’].*\1:表示匹配以单引号或双引号括起来的字,例如"bar"或者'foo'

       
e\(ch\)o.*\1表示,当遇到echo时,把ch保存在内存中,并编号为1,之后,

                               
可以有0个或者多个字符。当再遇到ch时,匹配到一个。

#grep "\( [\"\'] \).*\1" junk
 可以匹配"'How are you'" #先双引号,再单引号和'"How
are you"'  #先单引号,再双引号   

               

[]:匹配指定范围内的任意单个字符

[^]:匹配指定范围之外的任意单个字符  


 

字符集合

       
[[:blank:]] 空格(space)与定位(tab)字符

       
[[:cntrl:]] 控制字符

       
[[:graph:]] 非空格(nonspace)字符

       
[[:space:]]        所有空白字符

       
[[:print:]] 可显示的字符

       
[[:xdigit:]] 十六进制数字

       
[[:punct:]] 所有标点符号

       
[[:lower:]] 小写字母

       
[[:upper:]] 大写字母

       
[[:alpha:]] 大小写字母

       
[[:digit:]] 数字

       
[[:alnum:]] 数字和大小写字母

               
# grep  '[[:space:]][[:digit:]]$' /etc/passwd 

                       
以空格数字结尾

 

注意:排序元素、等价字符集以及字符集,都仅在方括号表达式的方括号内才被认可,也即是说,[:alpha:]这样的正则表达式,匹配字符为a、l、p、h、a以及:,

表达所有英文字母的正确写法应为[[:alpha:]]       


 

 

BRE运算符优先级
由高到低


运算符  


表示意义

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

用于字符排序的方括号符号

\metacharacter

转义的meta字符

[]     

方括号表达式

\(\)
 \digit

子表达式与后向引用

* \{ \}      

前置单个字符重现的正则表达式

无符号 (no symbol)

连续

^
 $
             

锚点(Anchors)

 

 

练习2:

1.通过管道过滤ls -l输出的内容,只显示以abc开头的行。

$ ls -l | grep '^abc'

2.显示所有以d开头的文件中包含test的行。

$ grep 'test' d*

3.显示在aa,bb,cc文件中匹配test的行。

$ grep 'test' aa bb cc

4.显示aa文件中所有包含每个字符串至少有5个连续小写字符的字符串的行。

$ grep '[a-z]\{5\}' aa

5.如果Field被匹配,则ie就被存储到内存中,并标记为1,然后搜索任意个字符(.*),

这些字符后面紧跟着另外一个ie(\1),找到就显示该行。

$ grep 'F\(ie\)id.*\1' aa
                #如果用egrep或grep -E,就不用双引号进行转义,直接写成'F(ie)ld.*\1'就可以了。   

6.查找当前系统上名字为student(必须出现在行首0的用户的账号的相关信息,文件为/etc/passwd

$ grep'^student' /etc/passwd | cut -d: -f3

id -u student                   

       
        链接:

               
/etc/passwd 下的文件

               
[gz_field@gimei3 ~]$ cat /etc/passwd

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

               
bin:x:1:1:bin:/bin:/sbin/nologin

               
account:登录名

               
password;密码 密码不在这放
而在 /etc/shadow

               
UID:用户ID号

               
GID:基本组ID

               
comment 用户的注释信息 全名等信息

               
HOME DIR:家目录

               
SHELL:用户默认shell
  

7.分析/etc/inittab文件中如下文本中前两行的特征(每一行中出现的数字必须相同),

请写出精确找到类似两行的模式

11:1:wait:/etc/rc.d/rc 1              

13:3:wait:/etc/rc.d/rc 3                      

# grep '^1\([0-9]\):1.*\1$' /etc/inittab

 

4).扩展的正则表达式(Extended
Regular Expression, ERE)


⑴匹配单个字符时,基本同BRE

awk中存在一个例外,其\符号在方括号内表示其他的含义

若需匹配左方括号、连字符、右方括号或是反斜杠,则需使用[\[\-\]\\]

⑵不存在后向引用

⑶、匹配单个表达式与多个正则表达式

       
区间表达式{}
不需要前置反斜杠字符

               
a{5} 刚好重现五个a
, b{5,10}重现五到十个b

       

匹配0个或一个前置正则表达式

               
ab?c  -->ac 或者abc

       
+  匹配一个或多个前置正则表达式

               
ab+c  -->abc,abbc,abbbc...不匹配ab

⑷、交替运算符|
:匹配与这个序列,或者其他序列,或者...


               
qqq|www|eee|rrr|ttt|...

       
|与^,$结合使用,实现分组

               
^abcd|efgh$ 匹配字符串起始处是否有abcd,或者结尾处是否有efgh

               
^(abcd|efgh)$ 找一个正是abcd或者正是efgh的字符串

⑸、ab^cd,ef$gh
在扩展正则表达式仍然适用,无法匹配到任何东西


 

ERE运算符优先级
由高到低


运算符  


表示意义

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

用于字符排序的方括号符号

\metacharacter

转义的meta字符

[]     

方括号表达式

\(\)
 \digit

子表达式与后向引用

* \{ \}      

前置单个字符重现的正则表达式

无符号 (no symbol)

连续

^
 $
             

锚点(Anchors)

 

 

 

5).正则表达式的扩展

额外的GNU正则表达式运算符

运算符

含义

\w:

任何单词组成字符,相当于[[:alnum:]_]

\W:

任何非单词组成字符,相当于[^[:alnum:]_]      

\<\>:

匹配单词的起始与结尾

\B:

匹配两个单词组成字符之间的空字符串

\b:

匹配单词的起始或结尾处所找的的空字符串,这是\<与\>运算符的结合

由于awk使用\b表示后退字符,所以GNU
awk使用|y表示此功能

\' 
 \`

分别匹配emacs缓冲区的开始与结尾。GNU程序与emacs通常视为与^$同义

 

6).程序与正则表达式

UNIX程序及其正则表达式类型

类型

grep

sed 


ed

ex/vi

more

egrep

awk

lex

BRE 

√   

√   

√   

√   

√   

 

 

 

ERE

 

 

 

 

 

√   

√   

√   

\<
 \>

√   

√   

√   

√   

√   

 

 

 

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: