正则表达式与Linux通配符

正则表达式与通配符

  • 正则表达式用来在文件中匹配符合条件的字符串,正则是包含匹配。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结尾的行。
[] 匹配方括号中指定的任意一个字符,制匹配一个字符。例如:[aoeiu]匹配任意一个元音字母,[0-9]匹配任意一位数字,[a-z][0-9]匹配小写字字母和一位数字构成的 两位字符。
[^] 匹配除方括号中字符以外的任意一个字符。例如:[0-9]匹配任意一位非数字字符。[a-z]表示任意一位非小写字母。
\ 转义符。用于取消特殊符号的含义。
\ 表示前面的字符恰好出现n次。例如:[0-9]\{4\}匹配4位数字。
\ 表示其前面的字符出现不小于n次。例如:[0-9]\{2,\}表示两位及以上的数字。
\ 表示其前面的字符至少出现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中间的。所以,在使用正则表达式时,一定要留意语系问题!
为避免语系对正则表达式的干扰,应尽量使用正则表达式所提供的特殊字符 :

特殊符號 | 代表意義

  • |-
    [: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 的數字與字元
posted @ 2018-10-04 15:14  Keith_fool  阅读(1103)  评论(0编辑  收藏  举报