Linux 正则表达式

在 linux 中,常用的正则表达式引擎有:

  • POSIX 基本正则表达式(BRE)引擎,grep 使用
  • POSIX 扩展正则表达式(ERE)引擎,grep -E 使用

linux 正则表达式的元字符

. * [ ] ^ $ { } + ? | ( )

BRE 和 ERE 通用元字符

\ : 转义,将元字符当做普通字符,如 \(...\)与\{...\}

. : 匹配任意单个字符(除 NULL)

* : 匹配前一个字符 0 次或多次,如 .* 匹配任意字符的任意长度

^ : 开头定位,匹配以后面字符开头的行

$ : 结尾定位,匹配以前面字符结尾的行

[] : 匹配方括号内的任意字符,其中可用连字符(-)指的连续字符的范围; 可以用 ^ 符号表示匹配不在列表中的任一字符,匹配数字 [0-9],匹配非数字 [^0-9]

BRE 特有元字符

\{n, m\} : 区间表达式,匹配前面一个字符 n 到 m 次,\{n\} 匹配 n 次

ERE 特有元字符

相比于 BRE,使用 ERE 更加方便,建议以后使用 grep -E 来进行正则匹配
{n, m} : 区间表达式,匹配前面一个字符 n 到 m 次,{n} 匹配 n 次, {n,} 匹配 n 次以上

+ : 匹配前一个字符 0 次或多次

? : 匹配前一个字符 0 次或 1 次

| : 表示 “或” ,实现多个正则表达式的匹配,匹配其中之一

() : 匹配括号括起来的正则表达式群

字符集

  • [[:alnum:]] 所有字母与数字; [[:alpha:]] 所有字母; [[:digit:]] 所有数字
  • [[:blank:]] 所有水平空格; [[:space:]] 所有水平与垂直空格符; [[:punct:]] 所有标点符号
  • [[:graph:]] 所有可打印字符(不包含空格); [[:print:]] 所有可打印字符(包含空格)
  • [[:upper:]] 所有大写字母; [[:lower:]] 所有小写字母

grep

grep 会在文本文件中查找一个指定的正则表达式,并把匹配行输出到标准输出。

grep [options] regex [file...] 其中 regex 即正则表达式

grep 参数

-c 显示符合要求的行的个数;
-i 忽略大小写;
-n 输出行号;
-v 反向输出,也就是不匹配的内容;
-o 只显示被匹配到的字符串;
-f <规则文件> 查找符合指定规则文件的内容,格式为每行一个规则样式
-E 使用扩展正则表达式进行匹配

实例

  1. 匹配空行

    1
    grep '^$' test
  2. 查找文件 test 中有三个数字连在一起的行

    1
    2
    3
    grep -n -E '[0-9][0-9][0-9]' test # -n 显示行号,-E 可以省略,grep 查找可以省略 ''
    grep -n -E '[0-9]{3}' test # 不能省略 -E,需要用扩展的正则
    grep -n -E '[[:digit:]]{3}' test2 # 用字符集
  3. 查找 good 或 glad

    1
    grep -E 'g(oo|la)d' test