- 正则表达式的特殊字符包括:*.*[]^${}\+?|()*
字符 | 描述 |
---|---|
\ | 对特殊字符转义 |
^ | 以什么字符开头 |
$ | 以什么字符结尾 |
. | 匹配单个字符 |
[ ] | 匹配一组字符 |
[^ ] | 排除字符 |
[ - ] | 匹配数字、字母的区间范围 |
* | 匹配字符出现0次或多次 |
? | 匹配字符出现0次或1次 |
+ | 匹配字符出现1次或多次 |
{ } | 具体指定字符出现的次数 |
| | 符号前后逻辑或 |
- 转义字符 \
如果要用特殊字符作为文本字符,就必须使用(\)转义。
1 | [root@student01 ~]# echo "3/2"| sed -n '/\//p' |
- 脱字符 ^
定义从数据文本行的行首开始的模式。
1 | [root@student01 ~]# echo "Books are great" |sed -n '/^Book/p' |
- 美元符 $
放在文本模式之后来指明数据行必须以该文本模式结尾。
1 | [root@student01 ~]# echo "This is a good book" |sed -n '/book$/p' |
注:脱字符和美元符可以组合使用。
4. 点号字符 .
特殊字符点号用来匹配除换行符之外的任意单个字符。
1 | [root@student01 ~]# cat data.txt |
注:在正则表达式中,空格也是字符。
5. 字符组 [ ]
定义用来匹配文本模式中某个位置的一组字符。
1 | [root@student01 ~]# echo "Yes" |sed -n '/[Yy][Ee][Ss]/p' |
- 排除型字符组 [^]
在正则表达式模式中,也可以反转字符组的作用。
1 | [root@student01 ~]# echo "I have a apple" |sed -n '/[ab]pple/p' |
还可以在单个字符组指定多个不连续的区间。
1 | [root@student01 ~]# cat data.txt |
- 特殊的字符组
基础正则表达式引擎还包含一些特殊的字符组,可用来匹配特定类型的字符。
组 | 描述 |
---|---|
[[:alpha:]] | 匹配任意字母字符,不管是大写还是小写 |
[[:alnum:]] | 匹配任意字母数字字符0 |
[[:blank:]] | 匹配空格或制表符 |
[[:digit:]] | 匹配0~9之间的数字 |
[[:lower:]] | 匹配小写字母字符a~z |
[[:print:]] | 匹配任意可打印字符 |
[[:punct:]] | 匹配标点符号 |
[[: space:]] | 匹配任意空白字符:空格、制表符等 |
[[:upper:]] | 匹配任意大写字母字符A~Z |
可以在正则表达式模式中将特殊字符组像普通字符组一样使用。
1 | [root@student01 ~]# echo "abc" |sed -n '/[[:alpha:]]/p' |
- 星号 *
在字符后面放置星号表明该字符必须在匹配模式的文本中出现0次或多次。
1 | [root@student01 ~]# echo "ik" |sed -n '/ie*k/p' |
将点号特殊字符和星号特殊字符组合起来。这个组合能够匹配任意数量的任意字符。它通常用在数据流中两个可能相邻或不相邻的文本字符串之间。
1 | [root@student01 ~]# echo "I am sorry" |sed -n '/I.*sorry/p' |
星号还能用在字符组上。它允许指定可能在文本中出现多次的字符组或字符区间。
1 | [root@student01 ~]# echo "bt" |sed -n '/b[ae]*t/p' |
- 问号 ?
问号类似于星号,不过有点细微的不同。问号表明前面的字符可以出现0次或1次。
1 | [root@student01 ~]# echo "bt" |gawk '/be?t/{print $0}' |
与星号一样,你可以将问号和字符组一起使用。
1 | [root@student01 ~]# echo "bt" |awk '/b[ae]?t/{print $0}' |
如果字符组中的字符出现了0次或1次,模式匹配成立。但如果两个字符都出现了,或者其中一个字符出现了2次,模式匹配就不成立。
11. 加号 +
加号表明前面的字符可以出现1次或多次,但必须至少出现1次。
1 | [root@student01 ~]# echo "beet" |awk '/be+t/{print $0}' |
加号同样适用于字符组.
12. 花括号 {}
花括号允许你为可重复的正则表达式指定一个上限,可以用两种格式来指定区间。
- m:正则表达式准确出现m次。
- m, n:正则表达式至少出现m次,至多n次。通过指定间隔为2,限定了该字符在匹配模式的字符串中出现的次数。如果次数为1或者其他都不匹配。
1
2
3
4[root@student01 ~]# echo "beet" |awk '/be{2}t/{print $0}'
beet
[root@student01 ~]# echo "bet" |awk '/be{2}t/{print $0}'
[root@student01 ~]#
也可以同时设置上限和下限间隔模式匹配同样适用于字符组。1
2
3
4
5
6[root@student01 ~]# echo "beet" |awk '/be{2,3}t/{print $0}'
beet
[root@student01 ~]# echo "beeet" |awk '/be{2,3}t/{print $0}'
beeet
[root@student01 ~]# echo "beeeet" |awk '/be{2,3}t/{print $0}'
[root@student01 ~]#1
2
3
4[root@student01 ~]# echo "beeet" |awk '/b[ae]{2,3}t/{print $0}'
beeet
[root@student01 ~]# echo "baaat" |awk '/b[ae]{2,3}t/{print $0}'
baaat
- 管道符号 |
管道符号允许你在检查数据流时,用逻辑OR方式指定正则表达式引擎要用的两个或多个模式。
1 | [root@student01 ~]# echo "The cat is asleep" |awk '/cat|dog/{print $0}' |
管道符号两侧的正则表达式可以采用任何正则表达式模式(包括字符组)来定义文本。
1 | [root@student01 ~]# echo "The cat is asleep" |awk '/[ch]at|dog/{print $0}' |
- 表达式分组 ( )
正则表达式模式也可以用圆括号进行分组。将分组和管道符号一起使用是常见的做法。
1 | [root@student01 ~]# echo "cat" | gawk '/(c|b)a(b|t)/{print $0}' |