# **前言**
Linux 中对于流式数据处理有 sed 和 gawk 两种工具可以使用,其中模式 (正则) 匹配可以很好的协助我们要对哪些行做处理。因此,正则匹配也就成为 linux 中相对来说比较重要的知识点,对此做了一些整理归纳。
## 特殊字符
本文对正则表达式的归纳主要从 正则表达式的 特殊字符入手,正则中的特殊字符有:
. * + ? ^ $ \ | / () {} []
一共15 个字符,可以分类记忆为 (4 + 2 + 3 + 2 * 3):
- 4 个填充类标识: . * + ?
- 2 个锚点符号: ^ $
- 3 个斜线: \ | /
- 6 个括号: ( ) { } [ ]
## BRE 和 ERE
Linux 中的正则匹配引擎有两种:
- BRE: POSIX 基础正则表达式,basic regular expression
- ERE:POSIX 扩展正则表达式,extended regular expression
显然 ERE 支持的功能比 BRE 更强大,但是所需要的性能开销也更大。 其中, sed 仅仅支持 BRE 引擎(因为更看重流式数据的处理数据),gawk 支持了 ERE。
其中 BRE 无法支持 :
- 加号: +
- 问号: ?
- 管道符号: |
- 间隔符号: { }
- 分组符号: ( )
> gawk 如果要是用 间隔符号 , 需要加上 --re—interval 标识
>
# **四个填充类标识**
**点号 .**
- 表明该位置有一个任意字符
**星号 ***
- 表明前一个字符可以出现任意多次(包括0次)
**加号 +**
- 表明前一个字符至少出现1 次
**问号 ?**
- 表明前一个字符出现 0 次 或者 1 次
# **两个锚点类符号**
**脱字符 ^**
- 一般用于表达式开头,限定表达式从首部开始匹配
- 如果用于**区间符号**(见下文),表明区间取反
**美元符 $**
- 一般用于表达式末尾,限定字符串末尾模式
# **三个斜线**
**反斜线 \**
- 用于转义特殊字符
**管道符 |**
- 「或」 语法,用于连接两个匹配规则,任意规则命中,即为命中
**正斜线 /**
- 字段分隔符 (FS: field separator ),在 sed 或者 gawk 中分割参数信息
# **六个括号**
**分组符号 ( )**
- 用于将一串字符视为整体, 一般后面可接 . * ? + {} 等标识符
**间隔符 { }**
- 用于指定前一个字符的出现次数,常见用法有 {m} 或者 {m, n}
**字符组/区间 [ ]**
- 字符组: 表示该位置值字符组中的任一字符,例如 [ab] [abcdefghi] 等
- 区间: 可以用 - 表示取值范围,避免穷举。 例如 [a-g] [1-9]
- 特殊字符组: 用标识来表示区间,特殊字符组如下表所示
| 组 | 描述 |
| --- | --- |
| [[:alpha:]] | 匹配任意字母字符,不管是大写还是小写 |
| [[:alnum:]] | 匹配任意字母数字字符0~9、A~Z或a~z” |
| [[:blank:]] | 匹配空格或制表符 |
| [[:digit:]] | 匹配0~9之间的数字 |
| [[:lower:]] | 匹配小写字母字符a-z |
| [[:print:]] | 匹配任意可打印字符 |
| [[:punct:]] | 匹配标点符号 |
| [[:space:]] | 匹配任意空白字符: 空格、制表符、NL、FF、VT和 CR |
| [[:upper:]] | 匹配任意大写字母字符 A-Z |
发表评论