【注】文章中的所有截图均为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 ##为了让其可以严格匹配一个单词,需要加上“\<”和“\>”
但是仍会出现有多余字符的字符串被匹配(如上图),这是由于正则表达式中“单词”指的是两侧由非单词字符分割的字符串。
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] ##以数字开头的行
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开头的行
9、分支
前边介绍过的正则表达式,简单地执行“与”的组合,如:
^ht$ ##表示以h开头,并且以t结尾的行
若想表达“或”的意思,需要“|”。
^h|t$ ##表示以h开头,或者以t结尾的行
10、逆向引用
可以用“\”加上子表达式编号表示再次使用该子表达式匹配到的模式。子表达式编号根据出现的顺序从左至右。
(\<.*\>).?( )*\1 ##分解介绍如下
① (\<.*\>) 表示任意长度的单词,编号为1的子表达式。
② .? 0个或1个标点(因为前边匹配任意长度的单词,此处只能匹配到标点)。
③ ( )* 0个或多个空格,编号为2的子表达式。
④ \1 第一个子表达式匹配到的模式再次出现。