分享

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

 wusiqi111 2017-06-13

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 baab,  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

        nm的值必须介于0RE_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

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

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

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

 

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

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

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

 

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

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

.在同一个模式之后使用 \digit, 数字digit介于19个数字。

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

 :后向引用

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

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

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

        abcd[def]*\2\1  abcdcdab abcdeeecdab abceddeefffcdab....

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

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

        echo.*\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:]这样的正则表达式,匹配字符为alpha以及:

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

 

 

BRE运算符优先级 由高到低

运算符  

表示意义

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

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

\metacharacter

转义的meta字符

[]     

方括号表达式

  \digit

子表达式与后向引用

* \{ \}      

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

无符号 (no symbol)

连续

 $              

锚点(Anchors)

 

 

练习2

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

$ ls -l | grep '^abc'

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

$ grep 'test' d*

3.显示在aabbcc文件中匹配test的行。

$ grep 'test' aa bb cc

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

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

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

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

$ grep 'Fieid.*\1' aa                 #如果用egrepgrep -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:1wait:/etc/rc.d/rc 1              

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

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

 

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

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

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

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

\-
\\]

⑵不存在后向引用

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

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

                a{5} 刚好重现五个 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

 

 

 

 

 

   

   

   

\<  \>

   

   

   

   

   

 

 

 


    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多