shell基础(五)

来源:互联网 发布:云计算介绍正面报道 编辑:程序博客网 时间:2024/06/05 05:49

五.Shell的通配符和正则表达式

讲到正则表达式,必须先说自动机。这里的自动机是计算机理论里面的编译原理范畴
而不是自动化理论里面的另外一种说法。关于自动机的理论非常成熟,笔者最早的入门书籍就是清华大学的计算机教材《编译原理》张素琴,吕映芝,蒋维杜,戴桂兰编著。书中理论简洁有力,举例恰当,当然在编译领域还有很多经典的书籍,有待读者去参阅。书中有关于正则表达式与自动机之间的转换的理论支持,而至于如何在程序中实现这种支持,推荐一个博客:http://blog.csdn.net/justme0/article/details/20790389 图文并茂,写得棒棒哒。
说到这里,又想推荐一下自动化专业了,从经典控制理论,到现代控制理论,无疑不体现了数学之美,编程之美。
说远了,本节主要记录一下,linux中常用的正则表达式。在linux中支持正则表达式的命令非常多,这里主要对grep命令支持的正则表达是进行学习。
注意:shell里面的统配符,和这里的正则表达式并不相同。
5.1shell的通配符
下面是shell的通配符说明:
* 代表 0 个到无穷多个任意字符
? 代表一定有一个任意字符
[ ] 同样代表一定有一个在括号内的字符(非任意字符)。例如 [abcd] 代表一定有一个字符, 可能是 a, b, c, d 这四个任何一个
注意:[0123456789]这种写法太长,可以这样写[0-9],这里的减号表示连续的字符编码。
[^ ] 若中括号内的第一个字符为指数符号 (^) ,那表示反向选择,例如 [^abc] 代表 一定有一个字符,只要是非 a, b, c 的其他字符就接受的意思。

5.2正则表达式

^ 表示一行的开头
$ 表示一行的结尾
. (英文的点号)表示任意一个单字符
* 表示重复前一个0到无穷次的意思。
+ 表示重复前一个至少一次。
? 表示重复前一个,至多一次。即,0次或者1次。
[] 表示一个集合,这个集合里面的所有字符都可以被匹配
[^] 上面符号的补集,表示除括号里面的字符,都可以被匹配到。
{n,m} 表示重复前一个n到m次,包括n和m。
{n} 表示必须重复前一个n次
{n,} 表示至少重复前一个n次
() 表示将一个正则表达式括起来,当成一个组合,比如:(wanbiao){1,2}表示将wanbiao这个字符串重复1到2次,如果没有小括号,如下:wanbiao{1,2}表示将字母o重复1到2次。
| 表示或,即两个正则表达式中的任意一个匹配上即可,如(wan)|(biao) 表示匹配wan或者biao。

注意:对于shell来说大括号用于特殊的字符即,前面介绍的对变量的删除,替换,查找,因此要将大括号传递给grep,需要给大括号用一个反斜杠。同样的+,?,|,()都需要使用反斜杠

有时方括号表示的集合操作起来非常的麻烦,下面也定义了一些其他的字符集合:
[:alnum:] 表示字母与数字集合
[:alpha:] 表示字母集合
[:ascii:] ascii字符集合
[:blank:] 空格和制表符集合
[:cntrl:] 表示ascii控制字符集合
[:digital:] 表示数字集合
[:graph:] 表示非控制,非空格字符集合
[:lower:] 表示小写字母集合
[:print:] 表示可打印字符集合
[:punct:] 表示标点符号集合
[:space:] 表示空白字符,包括垂直制表符
[:upper:] 表示大写字母集合
[:xdigit:] 表示十六进制的数字集合

除了grep使用正则以外,还有sed,flex等等。关于这些命令的使用,可以man进行查看。
关于这些的例子,因为太多并没有列出,这里推荐《鸟哥的linux私房菜》基础篇.里面有关于这些是怎么使用的详细例子。

正则表达式的使用,推荐使用flex与bison进行一门编程语言的开发。

0 0