shell中的正则有两种类型的规则,基本类BRE与扩展类ERE,常见的命令支持与下
类型 | grep | sed | vi | egrep | awk |
---|---|---|---|---|---|
BRE | * | * | * | ||
ERE | grep -E | sed -r | * | * |
一、字符类
字符 | 支持类型 | 含义 |
---|---|---|
.(点) | BRE/ERE | 匹配除换行符之外的任意1个字符 |
[] | BRE/ERE | 匹配方括号中的任意1个字符 |
- | BRE/ERE | 在[]中使用,表示字符范围如a-z,A-Z,0-9 |
^ | BRE/ERE | 放在[]内的最开头,表示除方括号中的字符以外的所有字符(逻辑“非”) 如[^def]表示匹配不是d、e、f这三个字符的 |
\ | BRE/ERE | 转义字符,关闭其后续字符的特殊意义,恢复其原意。 如表达式中.代表任意字符,\.则表示.本身 |
POSIX字符类 [[:xxx:]] | BRE/ERE | 预定义的命名符号 [[:digit:]] 数字 [[:lower:]] 小写字母,相当于[a-z] [[:upper:]] 大写字母,相当于[A-Z] [[:space:]] 空白字符(新行,空格,制表符) [[:graph:]] 非空字符(非空格、控制字符) [[:cntrl:]] 控制字符 [[:print:]] 可打印字符(包括空格) [[:alnum:]] 文字及数字 [[:punct:]] 标点符号 [[:xdigit:]] 十六进制数字(0-9,a-f,A-F) |
\w | BRE/ERE | 匹配字母、数字字符和下划线,也就是[A-Za-z0-9_] |
\W | BRE/ERE | 匹配非字母、数字字符和下划线,也就是[^A-Za-z0-9_] |
特殊字符类 (仅grep的perl 模式支持) | grep -P | \r 回车 \n 换行 \b 退格 \t 制表符 \v 垂直制表符 \f 分页符 \d 等价于 [0-9] \D 等价于 [^0-9] \s 非空白字符,等价于[^\f\n\r\t\v] \S 空白字符,等价于[ \f\n\r\t\v] |
二、数量限定符(注意两种模式的写法,BRE模式除*外均需转义)
字符 | 支持类型 | 含义 |
---|---|---|
\? / ? | BRE / ERE | 紧接它前面的单元匹配0个或1个 ** 不支持非贪婪模式 ** |
\+ / + | BRE / ERE | 紧接它前面的单元匹配1个或多个 |
* / * | BRE / ERE | 紧接它前面的单元匹配0个或多个 |
\{N\} / {N} | BRE / ERE | 紧接它前面的单元精确匹配N个 如 ab{2}表示匹配abab |
\{N,\} / {N,} | BRE / ERE | 紧接它前面的单元精确匹配>=N个 如 a{2,}表示匹配aa…… |
\{,M\} / {,M} | BRE / ERE | 紧接它前面的单元精确匹配<=N个 如 a{,2}表示匹配……a或……aa |
\{N,M\} / {N,M} | BRE / ERE | 紧接它前面的单元精确匹配>=N个,并且<=M个 |
三、位置匹配符
符号 | 支持类型 | 含义 | 示例 |
---|---|---|---|
^ | BRE/ERE | 表示行首 | ^[A-Z] 表示行首为大写字母 |
$ | BRE/ERE | 表示行尾 | [a-z]$ 表示行尾为大写字母 ^$ 表示匹配空行 ^[[:space:]]*$ 表示匹配只有空格或tab的空白行 |
\< | BRE/ERE | 表示单词的左侧 | \<a 表示以a开头的单词 |
\> | BRE/ERE | 表示单词的右侧 | be\>表示以be结尾的单词 \<grep\>匹配完整的单词grep |
\b | BRE/ERE | 表示单词的两侧 | \ba <==> \<a,be\b <==> be\> \bgrep\b <==>\<grep\> |
\B | BRE/ERE | 表示不是单词的两侧 | \B[ef]表示不以e或f开头的单词 [ef]\B表示不以e或f结尾的单词 |
四、分组及引用
符号 | 支持类型 | 含义 | 示例 |
---|---|---|---|
无符号 | BRE/ERE | 表示连续 | echo 'cabca'|grep 'abc' -c ==>1 echo 'cabdca'|grep 'abc' -c ==>0 |
\| / | | BRE / ERE | 表示逻辑“或” | echo 'cabca'|egrep 'abc|abd' -c ==>1 echo 'cabda'|egrep 'abc|abd' -c ==>1 |
\1-\9 | 引用 | 模式中,如果使用\(\)实现了分组,在某行文本的检查中,如果\(\)的模式匹配到了某内容, 此内容后面的模式中可以被引用; | |
\(\) / () | BRE / ERE | 分组符号 | 脚本中可以用${BASH_REMATCH[n]}引用 |
五、修饰符
修饰符用在正则表达式结尾,例如:/dog/i,其中 “ i “ 就是修饰符,它代表的含义就是:匹配时不区分大小写,常见的修饰符:
g 全局匹配(即:一行上的每个出现,而不只是一行上的第一个出现)
s 把整个匹配串当作一行处理
m 多行匹配
i 忽略大小写
x 允许注释和空格的出现
U 非贪婪匹配