正则表达式和通配符
基本的正则表达式
正则表达式和通配符是完全不一样的东西。通配符代表的是 bash 操作接口的一个功能,而正则表达式则是一种字符串处理的表达方式。
# 基础的正则表达式
* 匹配前面一个普通字符的 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 的都不算
正则表达式扩展
# 正则表达式扩展
? 匹配前一个字符 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
通配符
# 通配符(不同正则,通配符是 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 也会被选取进来。因此,在使用正则表达式时,需要特别留意当时环境的语系为何, 否则可能会发现与别人不相同的选取结果喔。那么针对这个问题的话,我们就可以使用上述那些特殊符号,如下所示。
[A-Z] 等同于 [[:upper:]]
[^A-Z] 等同于 [^[:upper:]]
当然一般情况下使用正则表达式时,使用的都是兼容于 “POSIX” 的标准,因此使用 C 这个语系也可。但是上述的特殊符号也需要了解哦。