Shell正则表达式
2021年4月9日
正则表达式介绍
正则表达式是一种文本模式匹配,包括普通字符(例如:a到z之间的字母)和特殊字符(称为”元字符“)。它是一种字符串匹配的模式,可以用来检查一个字符串是否含有某子字串、将匹配的子串替换或者从某个字符串中取出某个条件的子串。
正则表达式就像数学公式一样,我们可以通过正则表达式提供的一些特殊字符来生成一个匹配对应字符串的公式,用此来从海量数据中匹配出自己想要的数据。
正则表达式是一个第三方产品,常被计算机语言广泛使用,比如:Shell、PHP、python、Java、js 等。
shell 也支持正则表达式,但不是所有的命令都支持正则表达式,常见的命令中只有 grep
、sed
、awk
命令支持正则表达式。
特殊字符
定位符:
同时锚定开头和结尾,做精确匹配;单一锚定开头或结尾,做模糊匹配。
定位符 | 说明 |
---|---|
^ | 锚定开头; ^a:以 a 开头,默认锚定一个字符 |
$ | 锚定结尾; a$:以 a 结尾,默认锚定一个字符 |
匹配符:
匹配字符串
匹配符 | 说明 |
---|---|
. | 匹配除回车以外的任意一个字符 |
( ) | 字符串分组;(a|b):a 或 b |
[ ] | 字符类,匹配方括号 [ ] 之中的一个字符,[1-9] |
[^] | 匹配方括号 [ ] 中字符类之外的一个字符,[^a-g] |
\ | 转义字符 |
| | 或 |
限定符:
对前面的字符或者字符串做限定说明。
限定符 | 说明 |
---|---|
* | 某个字符之后出现,表示该字符不出现或出现多次;0 次及以上 |
? | 某个字符之后出现,表示该字符出现一次或不出现;0 次或 1 次 |
+ | 某个字符之后出现,表示其前面字符出现一次或多次;1 次及以上 |
{n,m} | 某个字符之后出现,表示该字符出现最少 n 次,最多 m 次 |
{m} | 某个字符之后出现,表示该字符正好出现了 m 次 |
元字符:
元字符是一种 Perl 风格的正则表达式,只有一部分文本处理工具支持它,并不是所有的文本处理工具都支持。shell 好行并不支持元字符的正则表达式。
元字符 | 说明 |
---|---|
\b | 匹配一个单词边界,也就是指单词和空格间的位置。 |
\B | 匹配非单词边界。 |
\d | 匹配一个数字字符。等价于 [0-9] |
\D | 匹配一个非数字字符。等价于 [^0-9] |
\f | 匹配一个换页符。 |
\n | 匹配一个换行符。 |
\r | 匹配一个回车符。 |
\s | 匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [ \f\n\r\t\v] |
\S | 匹配任何非空白字符。等价于 [^ \f\n\r\t\v] |
\t | 匹配一个制表符。 |
\v | 匹配一个垂直制表符。 |
\w | 匹配包括下划线的任何单词字符。等价于[A-Za-z0-9_] |
\W | 匹配任何非单词字符。等价于 [^A-Za-z0-9_] |
POSIX 特殊字符:
特殊字符 | 说明 |
---|---|
[:alnum:] | 匹配任意字母数字字(0-9、a-z、A-Z) |
[:alpha:] | 匹配任意字母,大写或小写(a-z、A-Z) |
[:digit:] | 匹配任意数字(0-9) |
[:graph:] | 非空字符(非空格控制字符) |
[:lower:] | 小写字符(a-z) |
[:upper:] | 大写字符(A-Z) |
[:cntrl:] | 控制字符 |
[:print:] | 非控制字符(包括空格) |
[:punct:] | 标点符号 |
[:blank:] | 空格和 TAB 字符 |
[:xdigit:] | 16 进制数字 |
[:space:] | 所有空白字符(新行、空格、制表符) |
注意:
[[ ]] 双中括号的意思:第一个中括号是匹配符 [ ],匹配中括号 [ ] 中的任意的一个字符;第二个中括号 [ ] 是格式,如 [:digit:]。
例:
匹配中文汉字: [\u4e00-\u9fa5]
匹配 e-mail 地址:\w+([-+.]\w+)@\w+([-.]\w+).\w+([-.]\w+)*
匹配网址 URL:http://(/[\w-]+.)+[\w-]+(/[\w- ./?%&=]*)?
补充
Linux 的三剑客 grep
、sed
、awk
都支持正则表达式
后续将学习三剑客的命令