正则表达式与通配符
正则表达式用来在文件中匹配符合条件的字符串, 正则是包含匹配. grep,awk,sed
等命令可以支持正则表达式.
通配符用来匹配符合条件的文件名, 通配符是完全匹配. ls,find,cp 这些命令不支
持正则表达式, 所以只能使用 shell 自己的通配符来进行匹配.
Linux 通配符
通配符是由 shell 处理的(不是由所涉及到命令语句处理的, 其实我们在 shell 各个命令
中也没有发现有这些通配符的介绍), 它只会出现在命令的 "参数" 里. shell 会将其当作
路径或文件名去在磁盘上搜寻可能的匹配; 若符合要求的匹配存在, 则进行代换; 否则
就将该通配符作为一个普通字符传递给命令, 然后再由命令进行处理.
总之, 通配符实际上就是一种 shell 实现的路径扩展功能, 在通配符被处理后, shell 会
先完成该命令的重组, 然后再继续处理重组后的命令, 直至执行该命令.
shell 常见通配符
字符 | 含义 | 实例 |
---|---|---|
* | 匹配 0 个或多个字符 | a*b a 与 b 之间可以有任意长度的任意字符,也可以一个也没有,例如 aabcb,axyzb |
? | 匹配任意一个字符 | a?b a 与 b 之间必须也只能有一个字符,可以是任意字符,例如:aab,acb,a0b |
[list] | 匹配 list 中的任意一个字符 | a[xyz]b a 与 b 之间必须也只能有一个字符,但只能是 list 中的,例如:axb,ayb,azb |
[!list] | 匹配非 list 中的任意一个字符 | a[!0-9] a 与 b 之间必须也只能有一个字符,但不能是 list 中,例如:axb,acb,a-b |
[c1-c2] | 匹配 c1-c2 中的任意一个字符 | a[0-9] 在 c1 到 c2 间匹配一个字符 |
{string1,string2,...} | 匹配 string1 或 string2 其一字符串 | a{abc,xyz,123}b a 与 b 之间只能是 {} 中的字符串。 |
注: 通配符看起来有点像正则表达式语句, 但是它与正则表达式不同, 不能相互混淆.
把通配符理解为 shell 特殊代号字符就可. 而且涉及的只有:*,?,[],{}, 这几种.
基础正则表达式
元字符 | 作用 |
---|---|
* | 前一个字符匹配 0 次或任意多次 |
. | 匹配除了换行符外任意一个字符 |
^ | 匹配行首。例如:^hello 会匹配以 hello 开头的行。 |
$ | 匹配行尾。例如:hello$ 会匹配以 hello 结尾的行。 |
[] | 匹配方括号中指定的任意一个字符,制 < strong ztid="156" ow="24" oh="16">匹配 一个字符。例如:[aoeiu] 匹配任意一个元音字母,[0-9]匹配任意一位数字,[a-z][0-9]匹配小写字字母和一位数字构成的 两位字符。 |
[^] | 匹配除方括号中字符以外的任意一个字符。例如:[^0-9]匹配任意一位非数字字符。[^a-z]表示任意一位非小写字母。 |
\ | 转义符。用于取消特殊符号的含义。 |
\{n\} | 表示前面的字符恰好出现 n 次。例如:[0-9]\{4\}匹配 4 位数字。 |
\{n,\} | 表示其前面的字符出现不小于 n 次。例如:[0-9]\{2,\}表示两位及以上的数字。 |
\{n,m\} | 表示其前面的字符至少出现 n 次,最多出现 m 次。例如:[a-z]\{6,m\}匹配 6 到 8 位的小写字母。 |
语系对正则表达式的影响
由于不同语系的编码表不同, 所以会造成我们获取数据的差异. 例如:
LANG = C :0 1 2 3 4 5 ... A B C D E ..... Z a b c d e ....z
LANG = zh_TW.big5 : 0 1 2 3 4 5 ..... A a B b C c D d ...Z z
此时 , 如果你想要获取大写字母而实用 [A-Z] 时, LANG = C 会很容易取出大写字母(因为码表 A-Z 是连续的, 中间并没有其他字符), 而对 zh_TW.big5, 会发现 a - z 也同样被取出来了. 这是因为对于 LANG = zh_TW.big5 编码 a - z 是混在 A- Z 中间的. 所以, 在使用正则表达式时, 一定要留意语系问题!
为避免语系对正则表达式的干扰, 应尽量使用正则表达式所提供的特殊字符 :
来源: http://www.bubuko.com/infodetail-2794086.html