正则表达式是对文本进行处理的工具。它很酷,不过不好理解。它能够用极其精简的语言来描述我们对文本的处理任务。但是不好阅读。
不管怎么说,它几乎是所有编程语言,和相关文本工具,所采用的标准文本处理方法。因此有必要学习它。
linux 中的正则表达式,一般有两种:
很多工具默认支持基本的正则表达式,但是可以通过选项开启扩展正则表达式。
.
:单个字符[]
: 括号范围内的单个字符[^]
:不再括号范围内的单个字符[:name:]
:预定义的字符集合
[:alnum:]
: 数字和字母[:alplha:]
:字母[:upper:]
:大写字母[:lower:]
:小写字母[:blank:]
:空格和制表符[:space:]
:空白符[:cntrl:]
:非打印字符[:digit:]
:数字[:xdigit:]
:十六进制数字[:graph:]
: 可打印字符的非空白符[:print:]
:可打印字符[:pkunct:]
:标点符号*
:匹配 0 到 n 次,贪婪模式,即接下来的字符匹配,会被归为一次匹配\?
:0 次到 1 次\+
:1 次到 n 次\{x\}
: x 次\{x,y\}
:至少 m 次,最多 y 次^
:行首$
:行尾,例子:^$
空行\<
:单词词首\>
:单词词尾\(str\)
:(和)之间是一个正则分组,它也是一个正常的匹配\1
:引用第一个分组的结果\&
:前面所有分组的结果# 123 转变为 numnumnum
# s/.../num/g 内匹配目标,即1,2,3,匹配三次
# s/[[:digit:]]/.../g 是替换的内容,num
# 注意要将预定义集合放在 [] 内
# 输出 numnumnum
echo 123 | sed 's/[[:digit:]]/num/g'
# 贪婪匹配,输出 num
echo 123 | sed 's/[[:digit:]]*/num/g'
# 指定匹配次数,输出 numnum
echo 123 | sed 's/[[:digit:]]\{1,2\}/num/g'
# 匹配 1,2,3 三个分组
# \2 引用第二个分组的结果
# 输出 2
echo 123 | sed 's/\(1\)\(2\)\(3\)/\2/g'
?
、+
、{x}
、()
不用转义,即由 ? 变为 ?|
:或这是一个扩展功能,很多工具未必会支持。
# 正向预查,2 之后为 3,即匹配第二个 2
echo 1223 | grep -P '2(?=3)'
# 回顾查找,2 之前为 1,即匹配第一个 2
echo 1223 | grep -P '(?<=1)2'