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
grep '^$' test
查找文件 test 中有三个数字连在一起的行
1
2
3grep -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 # 用字符集查找 good 或 glad
1
grep -E 'g(oo|la)d' test