0%

正则表达式

  • 正则表达式的特殊字符包括:*.*[]^${}\+?|()*
字符 描述
\ 对特殊字符转义
^ 以什么字符开头
$ 以什么字符结尾
. 匹配单个字符
[ ] 匹配一组字符
[^ ] 排除字符
[ - ] 匹配数字、字母的区间范围
* 匹配字符出现0次或多次
? 匹配字符出现0次或1次
+ 匹配字符出现1次或多次
{ } 具体指定字符出现的次数
| 符号前后逻辑或
  1. 转义字符 \

如果要用特殊字符作为文本字符,就必须使用(\)转义。

1
2
3
4
[root@student01 ~]# echo "3/2"| sed -n '/\//p'
3/2
[root@student01 ~]# echo "3/2"| sed -n '///p'
sed: -e expression #1, char 3: unknown command: `/'
  1. 脱字符 ^

定义从数据文本行的行首开始的模式。

1
2
3
4
[root@student01 ~]# echo "Books are great" |sed -n '/^Book/p'
Books are great
[root@student01 ~]# echo "The book store" |sed -n '/^book/p'
[root@student01 ~]#
  1. 美元符 $

放在文本模式之后来指明数据行必须以该文本模式结尾。

1
2
3
4
[root@student01 ~]# echo "This is a good book" |sed -n '/book$/p'
This is a good book
[root@student01 ~]# echo "This book is good" |sed -n '/book$/p'
[root@student01 ~]#

注:脱字符和美元符可以组合使用。
4. 点号字符 .

特殊字符点号用来匹配除换行符之外的任意单个字符。

1
2
3
4
5
6
7
8
[root@student01 ~]# cat data.txt 
This is a test of a line.
The cat is sleeping.
This test is at line four.
at ten o'clock we'll go home.
[root@student01 ~]# sed -n '/.at/p' data.txt
The cat is sleeping.
This test is at line four.

注:在正则表达式中,空格也是字符。
5. 字符组 [ ]

定义用来匹配文本模式中某个位置的一组字符。

1
2
3
4
[root@student01 ~]# echo "Yes" |sed -n '/[Yy][Ee][Ss]/p'
Yes
[root@student01 ~]# echo "YES" |sed -n '/[Yy][Ee][Ss]/p'
YES
  1. 排除型字符组 [^]

在正则表达式模式中,也可以反转字符组的作用。

1
2
3
4
5
6
7
8
9
10
11
12
[root@student01 ~]# echo "I have a apple" |sed -n     '/[ab]pple/p'
I have a apple
[root@student01 ~]# echo "I have a apple" |sed -n '/[^ab]pple/p'
[root@student01 ~]#
7. **区间 [-]**

可以用单破折线符号在字符组中表示字符区间。
```bash
[root@student01 ~]# echo "1234" |sed -n '/^[0-9][0-9][0-9][0-9]$/p'
1234
[root@student01 ~]# echo "Abcd" |sed -n '/^[A-Z][a-z][a-z][a-d]$/p'
Abcd

还可以在单个字符组指定多个不连续的区间。

1
2
3
4
5
6
[root@student01 ~]# cat data.txt 
cat
Hat
[root@student01 ~]# cat data.txt |sed -n '/^[c-dH-N]/p'
cat
Hat
  1. 特殊的字符组

基础正则表达式引擎还包含一些特殊的字符组,可用来匹配特定类型的字符。

描述
[[:alpha:]] 匹配任意字母字符,不管是大写还是小写
[[:alnum:]] 匹配任意字母数字字符09、AZ或a~z
[[:blank:]] 匹配空格或制表符
[[:digit:]] 匹配0~9之间的数字
[[:lower:]] 匹配小写字母字符a~z
[[:print:]] 匹配任意可打印字符
[[:punct:]] 匹配标点符号
[[: space:]] 匹配任意空白字符:空格、制表符等
[[:upper:]] 匹配任意大写字母字符A~Z

可以在正则表达式模式中将特殊字符组像普通字符组一样使用。

1
2
3
4
[root@student01 ~]# echo "abc" |sed -n '/[[:alpha:]]/p'
abc
[root@student01 ~]# echo "This is, a test" |sed -n '/[[:punct:]]/p'
This is, a test
  1. 星号 *

在字符后面放置星号表明该字符必须在匹配模式的文本中出现0次或多次。

1
2
3
4
[root@student01 ~]# echo "ik" |sed -n '/ie*k/p'
ik
[root@student01 ~]# echo "ieek" |sed -n '/ie*k/p'
ieek

将点号特殊字符和星号特殊字符组合起来。这个组合能够匹配任意数量的任意字符。它通常用在数据流中两个可能相邻或不相邻的文本字符串之间。

1
2
[root@student01 ~]# echo "I am sorry" |sed -n '/I.*sorry/p'
I am sorry

星号还能用在字符组上。它允许指定可能在文本中出现多次的字符组或字符区间。

1
2
3
4
5
6
[root@student01 ~]# echo "bt" |sed -n '/b[ae]*t/p'
bt
[root@student01 ~]# echo "beet" |sed -n '/b[ae]*t/p'
beet
[root@student01 ~]# echo "btt" |sed -n '/b[ae]*t/p'
btt
  1. 问号 ?

问号类似于星号,不过有点细微的不同。问号表明前面的字符可以出现0次或1次。

1
2
3
4
5
6
[root@student01 ~]# echo "bt" |gawk '/be?t/{print $0}'
bt
[root@student01 ~]# echo "bet" |gawk '/be?t/{print $0}'
bet
[root@student01 ~]# echo "beet" |awk '/be?t/{print $0}'
[root@student01 ~]#

与星号一样,你可以将问号和字符组一起使用。

1
2
3
4
5
6
[root@student01 ~]# echo "bt" |awk '/b[ae]?t/{print $0}'
bt
[root@student01 ~]# echo "bat" |awk '/b[ae]?t/{print $0}'
bat
[root@student01 ~]# echo "baet" |awk '/b[ae]?t/{print $0}'
[root@student01 ~]#

如果字符组中的字符出现了0次或1次,模式匹配成立。但如果两个字符都出现了,或者其中一个字符出现了2次,模式匹配就不成立。
11. 加号 +

加号表明前面的字符可以出现1次或多次,但必须至少出现1次。

1
2
3
4
5
6
[root@student01 ~]# echo "beet" |awk '/be+t/{print $0}'
beet
[root@student01 ~]# echo "bet" |awk '/be+t/{print $0}'
bet
[root@student01 ~]# echo "bt" |awk '/be+t/{print $0}'
[root@student01 ~]#

加号同样适用于字符组.
12. 花括号 {}

花括号允许你为可重复的正则表达式指定一个上限,可以用两种格式来指定区间。

  • m:正则表达式准确出现m次。
  • m, n:正则表达式至少出现m次,至多n次。
    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 ~]#
    通过指定间隔为2,限定了该字符在匹配模式的字符串中出现的次数。如果次数为1或者其他都不匹配。
    也可以同时设置上限和下限
    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
  1. 管道符号 |

管道符号允许你在检查数据流时,用逻辑OR方式指定正则表达式引擎要用的两个或多个模式。

1
2
[root@student01 ~]# echo "The cat is asleep" |awk '/cat|dog/{print $0}'
The cat is asleep

管道符号两侧的正则表达式可以采用任何正则表达式模式(包括字符组)来定义文本。

1
2
[root@student01 ~]# echo "The cat is asleep" |awk '/[ch]at|dog/{print $0}'
The cat is asleep
  1. 表达式分组 ( )

正则表达式模式也可以用圆括号进行分组。将分组和管道符号一起使用是常见的做法。

1
2
3
4
[root@student01 ~]# echo "cat" | gawk '/(c|b)a(b|t)/{print $0}'
cat
[root@student01 ~]# echo "bat" | gawk '/(c|b)a(b|t)/{print $0}'
bat