正则表达式高级应用与 POSIX 标准解析
1. 字符范围与 POSIX 字符类
在处理正则表达式时,字符范围是一个常用的工具。例如,使用grep -h '^[A-Z]' dirlist*.txt可以匹配以大写字母开头的文件名。通过三字符范围,我们可以缩写 26 个字母,甚至可以使用多个范围来匹配以字母和数字开头的文件名,如grep -h '^[A-Za-z0-9]' dirlist*.txt。
在字符范围中,连字符-有特殊处理。若要在方括号表达式中包含连字符,需将其放在表达式的首位,例如grep -h '[-AZ]' dirlist*.txt会匹配包含连字符、大写字母 A 或大写字母 Z 的文件名。
传统的字符范围虽然易于理解且能有效指定字符集,但并非在所有情况下都能正常工作。例如,使用ls /usr/sbin/[ABCDEFGHIJKLMNOPQRSTUVWXYZ]*能得到以大写字母开头的文件列表,而ls /usr/sbin/[A-Z]*却会得到不同结果。这是因为早期 Unix 仅支持 ASCII 字符,其排序顺序与字典顺序不同。
为解决此问题,POSIX 标准引入了字符类,如下表所示:
| 字符类 | 描述 |
| — | — |
|[:alnum:]| 字母数字字符,在 ASCII 中相当于[A-Za-z0-9]|
|[:word