Linux - 正则表达式

223 阅读2分钟

前言

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:]]匹配任意字母数字字符09、AZ或a~z”
[[:blank:]]匹配空格或制表符
[[:digit:]]匹配0~9之间的数字
[[:lower:]]匹配小写字母字符a-z
[[:print:]]匹配任意可打印字符
[[:punct:]]匹配标点符号
[[:space:]]匹配任意空白字符: 空格、制表符、NL、FF、VT和 CR
[[:upper:]]匹配任意大写字母字符 A-Z