http://www.eetop.cn/blog/html/65/554165-26125.html
http://blog.youkuaiyun.com/whxlovehy/article/details/6052366
Explain 1:
1、正则表达式是用来匹配字符串的,这个就不解释了
2、通配符是用来通配文件名的,也就是shell在做Pathname Expansion时用到的
Explain 2:
通配符,说白了一般只用于文件名匹配,它是由shell解析的。所谓的系统level的概念非常含糊,什么是系统level的?我们知道shell是一个命令解释器,它是内核的外壳,用于完成操作系统使用者与内核的沟通,因此,通配符实际上就是一个shell解释器去解析的符号,它的特殊涵义是由shell这个命令解释器赋予的。通配符的英文名是wildcard,就是万用牌的意思,它相当简单,一般来说,*nix系统上面的shell大多将三个特殊符号当作通配符,它们是 * ? [...], 其中 * 表示匹配任意长度的任意字符; ? 表示匹配一个任意字符, 而[...]则表示匹配括号中列出的字符中的任意一个。
其次。什么是正则表达式(regular expression, 缩写是regex.)?从简单的角度去理解,你可以把正则表达式看成是一种字符串匹配模式标准。这里最重要的就是,它本身,只是一种业界流行的标准,或者说,它是相当于对字符串匹配模式的一种规定。这种规定是随着相关的工具软件的发展而自称体系的“不成文规矩”。
-- 举个例子好了。假设首先有一种工具软件能够根据“模式(pattern)”搜索字符串,这个工具非常流行,以至于后续的工具软件都效仿那个工具软件定义的模式规则来匹配字符串 -- 慢慢的就形成标准,而且相对来说是一种不成文的规矩.
所以,正则表达式是什么? -- 它是一种对字符串匹配模式的描述和规定 -- 并且是一种标准。而不同的工具程序,也就是egrep、sed、awk这样的程序,以各种程度来支持这种字符串搜索模式,它们就是标准的实现,你可以在这种软件中使用正则表达式这种“匹配模式标准”。 -- 明白?
所以,在什么地方使用通配符?答案是只要是shell命令行或者shell脚本中,你都可以使用通配符;
在什么地方使用正则表达式?当你使用能够支持正则表达式的工具软件进行字符串处理时你就可以使用正则表达式。你还可以在支持正则表达式的语言中使用正则表达式,比如perl, java... C++中也有专门用于支持正则表达式的库。正则表达式总是和“使用什么工具软件或者语言”相关。相对来说,不同的工具和语言对正则表达式的支持程度不同,*nix里面将这些工具软件的对正则表达式的支持分类,因此也就有了“基础正则表达式”和“扩展正则表达式”。
不同的工具对正则表达式的支持,其实有些许的微妙不同;但是总体来说,使用正则还是基本按照标准来的。这些不同的工具支持程度,被称之为“正则流派”。而工具软件中支持这种匹配模式的那部分代码,称之为“正则引擎”。由于perl对正则表达式的支持非常到位,其正则引擎也比较优秀,因此perl语言算是正则的一大流派,目前大部分对正则的支持都或多或少参考了perl语言中的标准。
shell通配符
(假设当前目录下有chap , .chap , chap01 , chap02 , chap15 , chap16 , chapa ,chapb)
1.命令在shell中的一般执行过程:
当我们在终端输入一个命令时,该命令将作为shell的输入。shell想扫描输入的命令行,搜索元字符(通配符等)。元字符对命令本身来说,没有任何意义,但是对shell来说有特殊意义。当shell搜索到> , | ,*等元字符时,它在命令执行之前,先解释这些元字符说代表的意义(即命令的预处理过程),如将“rm *”命令中的"*"替换为当前目录下的所有文件名。当所有的预处理都完成后,shell将命令行传送给内核,最后由内核负责运行命令。此时的命令行里面不再有元字符。当内核正在执行命令时,shell就处于等待状态,等待来自内核的这个命令结束运行的消息。命令运行结束后,shell再次显示提示符,等待用户输入下一个命令。
2.shell的通配符:
通配符 | 匹配方式 | 实例 | 注意 |
* | 任意个字符,包括空字符 | ls *chap* 命令将输出: Chap chap01 chap02 chap15 chap16 chapa chapb chapc | *并不匹配以‘.’开头的文件(通常为linux中的隐藏文件) 和路径中的/字符。 但是可以匹配文件名中的多个‘.’ |
? | 单个字符 | ls chap? 命令将输出: Chapa chapb | |
[abc] | a,b,c中的一个字符 | ls chap[abc] 命令将输出: Chapa chapb chapc | |
[!abc] | 除a,b,c之外的任意字符(不局限于26个字母) | ||
[a-z] | a到z之间的任意一个asscii字符 | ls chap[a-c] 命令将输出: Chapa chapb chapc | [a-zA-Z]表示所有的26个大小写字母中的一个。使用 连字符时,左边的ASCII码必须小于右边的ASCII码。 在ASSIC序列中,大写字母排在小写字母前面 |
[!a-x] | 除a到z之外的任意一asscii字符 | ||
{pat1,pat2} | 模式1,模式2等 | ls chap{,01,15,a} 命令将输出: Chap chap01 chap15 |
3.转义与引用
当我们在shell要使用字符本身的意义而不是其通配意义时,可以使用转移字符'/',如ls /* 表示查看文件名为*的文件,而非查看以/开头的文件。也可以用引用的方法,如ls '*'表示查看文件名为*的文件。转义有两种方法,一是使用单引号,而是使用双引号。他们的区别是双引号没有单引号那么严格,它不会保护其中的$和`(反引号符),双引号中的$和`还是会被shell解释。
正则表达式
正则表达式类似于通配符,起到一个类似于通配的作用,但是与通配符不同的是这个表达式是命令的一个特性,与shell没有任何关系。它是有命令自己解释而不是shell,它适用于使用正则表达式的程序,如grep,sed等。由于正则表达式是由命令自己来解释而不是由shell来解释,所以必须用引号以阻止shell按它的意思对正则表达式中的元字符进行解释
1.基本正则表达式(Basic Regular Expression,BRE)
通配符 | 匹配方式 | 实例 |
* | *前一个字符的零次或多次出现 | g* 代表空字符或g , gg , ggg等 |
. | .代表单个字符 | .*代表空字符或任意个字符 |
[abc] | a,b,c中的一个字符 | |
[a-z] | a到z之间的任意一个asscii字符 | [1-3]表示1到3之间的某个数字 |
[^abc] | 除a,b,c之外的任意字符(不局限于26个字母) | |
[^a-z] | 除a到z之外的任意一asscii字符 | [^a-zA-Z]表示非字母字符 |
^pat | 行首为pat模式 | ^bash表示行首为bash |
pat$ | 行尾为pat模式 | ^pat$表示一行中只有单词pat |
^$ | 表示空行 |
2.扩展正则表达式(Expand Regular Expression,EBR)
表达式 | 含义 | 实例 |
+ | 匹配一个或多个它前面的字符 (与*的区别在于它不能匹配空串) | |
? | 匹配零个或一个它前面的字符 (与.的区别在于它可以匹配零个前面的字符) | |
exp1|exp2 | 匹配exp1或exp2 | GIF|JPEG表示GIF或JPEF |
(x1|x2)x3 | 匹配x1x3或x2x3 | (a|b)cd匹配acd或者bcd |
3.其他基本正则表达式(以sed命令举例)
-
重复模式——使用&符号,它表示出现在目标串中的源模式串;
我们常会遇到这样的情形:源模式串也出现在目标串中,我们就可以使用&这个特殊字符表示出现在目标串中的源模式串。
例:(以下两个命令效果相同)
sed 's/director/executive director/' tmp.lst
sed 's/director/executive &/' tmp.lst
-
间隔正则表达式(Interval Regular Expression,IRE)——在{和}里面使用一个或一对数值;
ch/{m/}——表示字符ch出现m次
ch/{m,n/}——表示字符ch出现次数在m和n之间
ch/{m,/}——表示字符ch至少出现m次
(其中ch可以是一个字符,或者一个.点,或者一个字符类。M和n的值不能大于255)
例:
sed -n /./{101,/}/p foo (选取字符数大于100的行)
grep ^./{101,150/}$ foo(选取行长度为101到150之间的行,注意此处的^和$)
-
带标志的正则表达式(Tagged Regular Expression,IRE)——把多个模式串用(和)组成组,在目标串中用数值标签表示。
TRE的工作过程:我们必须先确定处理的行和一行中各段内容,把每段内容放在一对圆括号里,圆括号用转义字符表示。各段的模式自动获得一个数值标号n,n表示从左边开始的第n组。为了在目标串中使用这些组,必须使用/n标签。这意味着,第一个组用/1表示,第二个组用/2表示,等等
4.元字符不起作用的情形及转义:
正则表达式中脱字符^有三个作用,当它在字符类的前面(即[^a-z])时,表示对字符类取反;当它在字符类 的外面且在表达式的最前面时(如^2)时,表示匹配行首位置;在其他位置则表示它自己。当-在字符类里而它的两侧没有其他字符时,或者当他出现于字符类外面时,-将失去其原意。当.和*在字符类之类将失去原意,当*在表达式的第一个字符时,将按它的字面意义进行匹配。如果要在元字符起作用的地方使用元字符本身,则使用/字符进行转义。