Chinaunix首页 | 论坛 | 博客
  • 博客访问: 89517
  • 博文数量: 42
  • 博客积分: 905
  • 博客等级: 准尉
  • 技术积分: 400
  • 用 户 组: 普通用户
  • 注册时间: 2011-03-14 14:08
文章分类

全部博文(42)

文章存档

2015年(1)

2011年(41)

我的朋友

分类: Python/Ruby

2011-03-17 16:44:23

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或exp2GIF|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)时,表示匹配行首位置;在其他位置则表示它自己。当 -在字符类里而它的两侧没有其他字符时,或者当他出现于字符类外面时, -将失去其原意。当 . *在字符类之类将失去原意,当 *在表达式的第一个字符时,将按它的字面意义进行匹配。如果要在元字符起作用的地方使用元字符本身,则使用 \字符进行转义。


 

总结  shell通配符和正则表达式各自的组合十分强大,匹配范围超强,关键在于自己的应用。由于个人能力有限,就不举例了!

转自:http://blog.csdn.net/whxlovehy/archive/2010/12/03/6052366.aspx

阅读(2675) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~