Linux Cheat Sheet - 正则表达式和通配符

正则表达式和通配符

基本的正则表达式

正则表达式和通配符是完全不一样的东西。通配符代表的是 bash 操作接口的一个功能,而正则表达式则是一种字符串处理的表达方式。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
# 基础的正则表达式

* 匹配前面一个普通字符的 0 次或多次
# Hel*o 可以是 helllllo 也可以是 heo 这个要注意

. 匹配任意一个字符,但注意只是一个
# …43 也就是 xxd43 sda43 12343都可以
# .* 就代表 0 个或者多个任意字符了,比如 g.*g

^ 匹配行首,行首就是 ^ 后面的字符
# ^cloud 也就是匹配行首为 cloud 的行
# 用在 [] 里面表示取反

$ 匹配行尾
# Cloud$ 也就是匹配行尾为 cloud 的行,^$ 就是空行匹配行首和行尾

[] 匹配字符集合,只取其中一个字符
# [01234]
# [0-4] 等价于 [01234]
# [^a-z] 在这里 ^ 表示取反,也就是除了 a-z 的所有字符
# [A-Za-z]* 以任意一个字母开头,可以0次或多次重复 匹配任何英文单词

\{\} 和 * 类似,表示前一个字符的重复但是更加精确,有两个 \ 是因为要转义 <>
# \{n\}重复n次
# \{n,\} 至少重复n次
# \{n, m\} 重复n-m次

\<\> 精确匹配
# \<the\> 只找 the 这个单词,包含 the 的都不算

正则表达式扩展

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 正则表达式扩展

? 匹配前一个字符 0 次或 1 次
# JO?B 也就是 JOB 或者 JOOB

+ 匹配前一个字符 1 或多次
# S+EU 也就是 SSEU SSSSSSEU

| 表示或的方式找出数个字符串
# gd|good 就是 gd 或者 good
# gd|good|dog 就是 gd 或者 good 或者 dog

() 找出组字符串
# g(la|oo)d 就是 glad 或者 good
# A(XY)+Z 就是 AXYZ 或者 AXYXYZ

通配符

1
2
3
4
5
6
7
8
9
10
11
12
# 通配符(不同正则,通配符是 shell 里面会用到的)

* 代表任意位任意字符
? 代表任意一个字符
^ 代表取反
[] 同正则表达式
{} 表示的是一个通配集合,用逗号隔开,表示或的关系

ls -l [a-h]*.h # a-h 字母开头的 .h 文件
ls -l [a-h]*.[^h]* # a-h 字母开头的,非 .h 结尾的文件

{[a-h]*.h, g?.h} # 代表 a-h 字母开头的 .h 文件或者 g 开头的两个字符的 .h 文件

在不支持正则表达式的工具中,比如 ls,那么 ls -l , 代表的是任意文件名,ls -l a\ 表示以 a 为开头的任何文件名。但是要在正则表达式中找到含有以 a 为开头的,那需要 ls | grep ‘^l’。

特殊符号

为了避免语系所造成的英文与数字的撷取问题,我们可以使用一些特殊符号。下面是这些特殊符号及其代表的意思。

特殊符号 代表意义
[:alnum:] 代表英文大小写字符及数字,亦即 0-9, A-Z, a-z
[:alpha:] 代表任何英文大小写字符,亦即 A-Z, a-z
[:blank:] 代表空白键与 [Tab] 按键两者
[:cntrl:] 代表键盘上面的控制按键,亦即包括 CR, LF, Tab, Del.. 等等
[:digit:] 代表数字而已,亦即 0-9
[:graph:] 除了空白字符 (空白键与 [Tab] 按键) 外的其他所有按键
[:lower:] 代表小写字符,亦即 a-z
[:print:] 代表任何可以被打印出来的字符
[:punct:] 代表标点符号 (punctuation symbol),亦即:” ‘ ? ! ; : # $…
[:upper:] 代表大写字符,亦即 A-Z
[:space:] 任何会产生空白的字符,包括空白键, [Tab], CR 等等
[:xdigit:] 代表 16 进位的数字类型,因此包括: 0-9, A-F, a-f 的数字与字符

什么是语系的问题呢?文件本质上是由 0 和 1 组成的,我们看到的字符文字和数字都是通过编码表转换而来的。那么不同语系的编码数据并不相同,所以就会造成数据选取结果的区别了。比如,在英文大小写的编码顺序中,zh_CN.big5 及 C 这两种语系的输出结果如下所示:

  • LANG=C 时:0 1 2 3 4 … A B C D … Z a b c … z
  • LANG=zh_CN 时:0 1 2 3 4 … a A b B … z Z

从中可以看到,这两种语系明显是不一样的。在选取大写字符而使用 [A-Z] 时,假如使用的是 C 语系的话,那么可以正确找到大写字符,但是假如使用的是 zh_CN.gb2313 的时候就会发现,小写的 b-z 也会被选取进来。因此,在使用正则表达式时,需要特别留意当时环境的语系为何, 否则可能会发现与别人不相同的选取结果喔。那么针对这个问题的话,我们就可以使用上述那些特殊符号,如下所示。

1
2
[A-Z] 等同于 [[:upper:]]
[^A-Z] 等同于 [^[:upper:]]

当然一般情况下使用正则表达式时,使用的都是兼容于 “POSIX” 的标准,因此使用 C 这个语系也可。但是上述的特殊符号也需要了解哦。

程序锅 wechat
欢迎关注微信公众号【一口程序锅】,不定期的技术分享、资源分享。
让我多买本书学习学习
0%