您的位置:首页 > 运维架构 > Shell

【Linux学习笔记九】Shell编程-正则表达式

2016-05-10 19:54 666 查看
【注】文章中的所有截图均为centos下实验结果,亲测命令正确= ̄ω ̄=



【参考资料】《Linux从入门到精通(第2版)》刘忆智
等编著


1、定义 :模式,对正在查找的文本的描述

POSIX库和PCRE均可以用于正则表达式编程。前者是Linux自带库,后者为Perl的库,功能更强大一些,也更难掌握。

2、字符集和单词
首先安装一下words:sudo yum install words 存在于 /usr/share/dict/words


“.”用于匹配换行符以外的任意一个字符。
.at ##匹配诸如cat、sat、bat、#at、~at的字符串


[a-z]at ##限定at之前只能是小写字符


“[ ]”用于指定一个字符集,但只匹配其中的一个字符。


[abc] ##只能匹配a或b或c中的一个字符


“-”用于描述一个范围。


[a-zA-Z] ##能够匹配所有的英文字符


[0-9] ##匹配所有的一位数字


$ egrep '[a-z]at' /usr/share/dict/words
##查找具有“一个字符+at”形式的单词










$ egrep '\<[a-z]at\>' /usr/share/dict/words
##为了让其可以严格匹配一个单词,需要加上“\<”和“\>”










但是仍会出现有多余字符的字符串被匹配(如上图),这是由于正则表达式中“单词”指的是两侧由非单词字符分割的字符串。


【转载请注明文章出处:/article/10208619.html



3、字符类
$ egrep "^[[:upper:]]t$" words
##找出所有以大写字母开头(^)和以t结尾($)的行










[[:upper:]]就是一个字符类,表示所有的大写字母,等价于[A-Z]。下边列出完整的字符串类



匹配字符
[[:alnum:]]

文字、数字字符
[[:alpha:]]

字母字符
[[:lower:]]

小写字母
[[:upper:]]

大写字母
[[:digit:]]

小数
[[:xdigit:]]

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

标点符号
[[:blank:]]

制表符和空格
[[:space:]]

空格
[[:cntrl:]]

所有控制符
[[:print:]]

所有可打印的字符
[[:graph:]]

除空格外所有可打印的字符
4、位置匹配

字符“^”和“$”分别用于匹配行首和行尾。“^$”可以匹配空行,“$^”不会报错,但不会输出任何东西。
^a[a-z]t$ ##a开头,t结尾,中间含有一个小写字母的行。

^[0-9] ##以数字开头的行










5、字符转义
元字符“.”、“[”等不能直接匹配,需要用“\”取消元字符的特殊含义。
www\.google\.cn
##匹配 www.google.cn

【转载请注明文章出处:/article/10208619.html



6、重复
“*”表示前边的模式重复0次或多次。
“+”表示前边的模式重复1次或多次。


“?”表示前边的模式重复0次或1次。


“{ }”指定前边模式的重复次数。


^a.*t$ ##a开头t结尾的行

\<hi\>.+\<Jerry\>
##单词hi后边隔了一个或几个字符后出现单词Jerry的行


\<[1-9][0-9]{7,}\>
##以数字1-9中的一个开始,第二位开始是0-9中的一个,从第二位开始重复至少7次(即代表超过七位的数的字符串)


元字符

描述

*

重复0次或多次

+

重复一次或多次

?

重复0次或一次

{n}

重复n次

{n,}

重复n次或更多次

{n,m}

重复不少于n次,不多于m次

7、子表达式
有时需要将多个字符构成的模式用括号括起来。
$ egrep "(or){2,}" words
##or重复2次或多次的行


$ egrep "or{2,}" words ##o后边跟着2个r或更多r的行























8、反义
“[^y]”表示除了这个字符(这里是y),注意区分表示行首的情况。
[^y] ##除了字母y

[^aeiou] ##除了字母a、e、i、o、u的所有字符


^[^y]
##不以字母y开头的行

【转载请注明文章出处:/article/10208619.html



9、分支
前边介绍过的正则表达式,简单地执行“与”的组合,如:
^ht$ ##表示以h开头,并且以t结尾的行

若想表达“或”的意思,需要“|”。



^h|t$ ##表示以h开头,或者以t结尾的行



10、逆向引用
可以用“\”加上子表达式编号表示再次使用该子表达式匹配到的模式。子表达式编号根据出现的顺序从左至右。
(\<.*\>).?( )*\1
##分解介绍如下


① (\<.*\>) 表示任意长度的单词,编号为1的子表达式。



② .? 0个或1个标点(因为前边匹配任意长度的单词,此处只能匹配到标点)。



③ ( )* 0个或多个空格,编号为2的子表达式。



④ \1 第一个子表达式匹配到的模式再次出现。








【转载请注明文章出处:/article/10208619.html





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