正则表达式和grep
正则表达式(Regular Expression)是对字符串和特殊字符操作的一种逻辑公式,通过结合工具实现对文本的检索、替换目标字符。
一.起源
美国新泽西州的Warren McCulloch和Walter Pitts 这两位生理方面的科学家,研究出了一种用数学方法来描述神经网络的新方法,他们将神经系统中的神经元描述成一个个小而简单的自动控制单元。随后,一名叫Stephen Kleene的数学家在他们的研究基础上提出了用正则集合的数学符号来描述模型的方法,从此就有了“正则表达式”这个术语。随后大名鼎鼎的Unix之父Ken Thomspon就把这一成果应用于计算搜索算法的一些早起研究,并把它引入QED编辑器中。从此,正则表达式在计算机领域得到了广泛的应用。现在所有的主流操作系统(Linux、Windows等)和主流的编程语(Shell、Java、Python等)言都有相应的正则表达式引擎。
二.grep
在Linux系统中,grep(Global search REgular expression and Print out the line)是一款文本过滤工具。根据用户指定的正则表达式对目标文本进行逐行匹配和检查,并把符合条件的行打印出来。其中又可以分为:grep、egrap和fgrep,egrap支持扩展的正则表达式,fgrep则不支持正则表达式。
三.基本正则表达式元字符
正则表达式的元字符根据其功能可分为四种:字符匹配、匹配次数、位置锚定和分组。
1.字符匹配
字符匹配项的字符都不表示字符意义,而表示控制或通配的功能。
元字符 | 含义 |
---|---|
. | 匹配任意单个字符 |
[] | 匹配指定范围内的任意单个字符 |
[:alnum:] | 字母和数字 |
[:alpha:] | 任何英文大小写字符,A-Z,a-z |
[:lower:] | 小写字母,a-z |
[:upper:] | 大写字母,A-Z |
[:blank:] | 空白字符 |
[:space:] | 水平和垂直的空白字符 |
[:cntrl:] | 不可打印的控制字符 |
[:digit:] | 十进制数字 |
[:graph:] | 可打印的非空白字符 |
[:print:] | 可打印字符 |
[:punct:] | 标点符号 |
2.匹配次数
用在指定次数的字符后面,用于指定前面的字符要出现的次数。
字符 | 匹配次数 |
---|---|
* | 匹配前面的字符任意次,包括0次 |
.* | 任意长度的任意字符 |
? | 匹配前面的字符0或1次 |
\+ | 匹配前面的字符至少1次 |
\{n\} | 匹配前面的字符n次 |
\{m,n\} | 匹配前面的字符至少m次,至多n次 |
\{,n\} | 匹配前面的字符至多n次 |
\{n,\} | 匹配前面的字符至少n次 |
3.位置锚定符
用于指定字符匹配的位置
字符 | 锚定位置 |
---|---|
^ | 行首锚定 |
$ | 行尾锚定 |
^$ | 空行 |
^[[:space]]*$ | 空白行,包括空行 |
\<或\b | 词首锚定 |
\>或\b | 词尾锚定 |
\<pattern> | 匹配整个单词 |
4.分组
用小括号把多个独立的字符捆绑在一起,当作一个整体一起处理。
例如:\(root\)\+
分组括号中的模式匹配到的内容会被正则表达式引擎记录于内部变量中,这些变量的命名方式为:\1,\2,\3,……
例如:\(string1\+\(string2\)*\)\1\2
则\1 : string1\+\(string2\)*
\2 : string2
后项引用时引用的是前面的表达式匹配得到的结果,而非匹配模式本身。
四.grep选项
grep [optinons] pattern [file]
--color=auto:对匹配的文本着色显示
-v:显示不被匹配到的行
-i:忽略大小写
-n:显示匹配的行数
-c:统计匹配的行数
-o:仅显示匹配到的字符串
-q:静默模式,不输出任何信息
-A #:显示匹配到的行的后#行
-B #:显示匹配到的行的后#行
-C #:显示匹配到的行的前后#行
-e:实现多个选项间的逻辑或(or)关系
-w:匹配整个单词