正则表达式LINUX

前端之家收集整理的这篇文章主要介绍了正则表达式LINUX前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

正则表达式

热身

正则表达式(regularexpression)@H_403_9@描述了一种字符串匹配的模式,可以用来检查一个串是否含有某种子串、将匹配的子串做替换或者从某个串中取出符合某个条件的子串等。

例如grep,expr,sed,awk.Vi@H_403_9@中经常会使用到正则表达式,为了充分发挥shell@H_403_9@编程的威力,@H_403_9@需要精通正则表达式。

下面先举个简单例子来让大家对正则表达式有个直观的感受。ls@H_403_9@命令是linux@H_403_9@下最常用的命令。ls@H_403_9@命令是list@H_403_9@的缩写,@H_403_9@缺省下ls@H_403_9@用来打印出当前目录的清单。

现在,我们只希望列出以d@H_403_9@开头的文件或目录,可以用lsd*@H_403_9@命令,这里*@H_403_9@是通配符,它表示匹配重复零次或多次前一字符。

@H_403_9@

举一反三,列出以che@H_403_9@开头的文件或目录,就可以用lsche*@H_403_9@命令。

是不是觉得有些觉得过于简单了啊??!!好吧,打完小怪,现在升下级。

开始……

如何列出当前目录下的所有目录(@H_403_9@不包含下面的子目录)@H_403_9@?

思考……

到了使出正则表达式杀手锏的时候了,在这里,我们还是使用ls@H_403_9@命令,但是加了个-l@H_403_9@选项(-l@H_403_9@选项作用是列出文件的详细信息)@H_403_9@,使用正则表达式列出当前目录下的所有目录,我们给出了两种方法(聪明的你当然会想到也可以用find@H_403_9@命令,呵呵,这属于第三种秘笈了)。且看:

这样列出来的内容有些多,没完全截下来所有显示结果,但这并不妨碍本文的讲解。

考虑到普通文件是以-@H_403_9@开头,如dataf1.txt@H_403_9@文件;目录是以d@H_403_9@开头的,如adv_shell@H_403_9@是目录,即第一个字母会不小心暴露出文件的身份属性

所以我们就从d@H_403_9@这里作为突破口,这时,你会想到,有多少个“开头”的d@H_403_9@就应该有多少个目录,太聪明了,好吧,我们按照你的思路实践下。

现在,问题出来了,怎么统计出来有多少个“开头”的d@H_403_9@?你想到了linux@H_403_9@中grep@H_403_9@命令,还想到了正则表达式,于是grep@H_403_9@和正则表达式开始粉墨登场了……

ls-l|grep"^d"

这条简单的命令就轻松解决了我们的问题,。"^d"@H_403_9@???你纳闷了,这个小东西配合起来怎么会有那么大的威力呢?这好比玩三国杀时刘备、司马懿、香香之间配合的威力……"^d"@H_403_9@,就是正则表达式的用法"^"@H_403_9@表示匹配行首,"^d"@H_403_9@合起来就表示以d@H_403_9@开头的一行,grep"^d"@H_403_9@就是过滤出以d@H_403_9@开头的那些行,d@H_403_9@表示目录,也就过滤出了当前目录中的所有目录。

谜底解开。现在你又想到,前面不是说还有一种方法的么,既然如此迫不及待,那就只好顺水推舟了。

第二种方法还是基于ls@H_403_9@命令,但是用了-F@H_403_9@选项,-F@H_403_9@选项能列出文件类型的指示符号,如下图所示:

仔细观察我们发现,在文件名后面,会多出了一些符号,如目录adv_shell@H_403_9@名字后多了条斜扛(/@H_403_9@),可执行文件checkhost.sh@H_403_9@名字后多了个星号(*@H_403_9@)……在此,如果想更多了解这些符号意义,可以查看ls@H_403_9@命令的详细信息。

我们现在把注意力集中到目录adv_shell@H_403_9@名字后多了条斜扛(/@H_403_9@)这条信息上。很快联想到,有多少个斜扛(/@H_403_9@)就应该对应多少目录,而且斜扛(/@H_403_9@)会跟在每个目录名的最后。我们又想到了grep@H_403_9@命令,还想到了应该怎样用正则表达式表示出匹配行尾,答案已经很接近了……

ls-F|grep"/$"

这条短命令又一切成全了我们的梦想。"/$"也是正则表达式的用法"$"@H_403_9@表示匹配行首,"/$"@H_403_9@合起来就表示匹配以/@H_403_9@结尾的行,grep"/$"@H_403_9@就是过滤出以/@H_403_9@结尾的那些行,/@H_403_9@表示目录,也就过滤出了当前目录中的所有目录。

在此基础上,我们发散一下思维,比如说想统计当前目录下的文件个数及目录个数,就可以使用以下命令:

ls-l*|grep"^-"|wc-l

ls-l*|grep"^d"|wc-l

好了,暂且休息,下面我们开始介绍更多关于正则表达式的知识。

蓄势

前面我们初识了^$*@H_403_9@这些个正则表达式的用法,下面我们将进行更高一级的升炼。

正则表达式是一个字符或和元字符组合成的字符集,它们匹配(@H_403_9@或指定)@H_403_9@一个模式。字符即普通字符(例如字符a@H_403_9@到z@H_403_9@),元字符即特殊字符(例如前面提到的字符^$*@H_403_9@)。正则表达式作为一个模板,将某个字符模式与所搜索的字符串进行匹配。

在这里,为简单见,我们不会介绍所有的正则表达式知识,只介绍常用的一些正则表达式知识。

一个正则表达式包含下面一个或多个项:

1.@H_403_9@一个字符集

这里的字符集里的字符表示的就是它们字面上的意思.@H_403_9@正则表达式最简单的情况就是仅仅由字符集组成,@H_403_9@而没有其他的元字符。

2.@H_403_9@锚

一个锚指明了正则表达式在一行文本中要匹配的位置,@H_403_9@例如^@H_403_9@和$@H_403_9@就是锚。

3.@H_403_9@修饰符

它们用于展开或缩小(@H_403_9@即是修改)@H_403_9@正则表达式匹配文本行的范围.@H_403_9@修饰符包括了星号、括号和反斜杠符号。

* 匹配重复零次或多次前一字

+ 匹配一个或多个前面的字符.@H_403_9@它的作用和*@H_403_9@很相似,@H_403_9@但唯一的区别是它不匹配零个字 符的情

? 匹配零或一个前面的字符。它一般用于匹配单个字符

. 匹配任意字符(@H_403_9@除换行符)

^ 匹配一行的开头,@H_403_9@但依赖于上下文环境,@H_403_9@可能在正则表达式中表示否定一个字符 集的意思
[...] 匹配集合中任意字符"[xyz]"@H_403_9@匹配字符x,y,@H_403_9@或z
[^...] 匹配不属集合任意字符
^,$ 匹配行首、行尾
\<,\> 用于表示单词的边界。\<@H_403_9@匹配词首,\>@H_403_9@词尾,如"\"@H_403_9@匹配单词"the"
\(...\) 正则表达式分组。进行子字符串提取(substringextraction)@H_403_9@一起使用很有用
\n 第n@H_403_9@个分组内容

\ 转义(escapes)@H_403_9@一个特殊的字符,@H_403_9@使这个字符表示原来字面上的意思。"\$"@H_403_9@表示 了原来的字面意思"$",@H_403_9@而不是在正则表达式中表达的匹配行尾的意思."\\"@H_403_9@也被 解释成了字面上的意思"\"

\{\} 指示前面正则表达式匹配的次数.

要转义是因为不转义的话大括号只是表示他们字面上的意思.@H_403_9@这个用法只是技巧上 的而不是基本正则表达式的内容."[0-9]\{5\}"@H_403_9@精确匹配5@H_403_9@个数字(@H_403_9@从0@H_403_9@到9@H_403_9@的数字).

| "@H_403_9@或"@H_403_9@,正则操作符用于匹配一组可选的字符

{n} n@H_403_9@是一个非负整数。匹配确定的n@H_403_9@次。例如,''o{2}''@H_403_9@不能匹配"Bob"@H_403_9@中的''o''@H_403_9@,但是能匹配"food"@H_403_9@中的两个o@H_403_9@。

{n,} n@H_403_9@是一个非负整数。至少匹配n@H_403_9@次。例如,''o{2,}''@H_403_9@不能匹配"Bob"@H_403_9@中的'o''@H_403_9@,但能匹配"foooood"@H_403_9@中的所有o@H_403_9@。''o{1,}''@H_403_9@等价于''o+''@H_403_9@。''o{0,}''@H_403_9@则等价于''o*''@H_403_9@。

{n,m} m@H_403_9@和n@H_403_9@均为非负整数,其中n<=m@H_403_9@。最少匹配n@H_403_9@次且最多匹配m@H_403_9@次。例如,"o{1,3}"@H_403_9@将匹配"fooooood"@H_403_9@中的前三个o@H_403_9@。''o{0,1}''@H_403_9@等价于''o?''@H_403_9@。请注意在逗号和两个数之间不能有空格。

\b 匹配一个单词边界,也就是指单词和空格间的位置。例如,''er\b''@H_403_9@可以匹配"never"@H_403_9@中的''er''@H_403_9@,但不能匹配"verb"@H_403_9@中的''er''@H_403_9@。

\B 匹配非单词边界。''er\B''@H_403_9@能匹配"verb"@H_403_9@中的''er''@H_403_9@,但不能匹配"never"@H_403_9@中的''er''

\w 匹配包括下划线的任何单词字符。等价于''[A-Za-z0-9_]''@H_403_9@。

\W 匹配任何非单词字符。等价于''[^A-Za-z0-9_]''@H_403_9@。

\d 匹配一个数字字符。等价于[0-9]@H_403_9@。

\D 匹配一个非数字字符。等价于[^0-9]@H_403_9@。

\f 匹配一个换页符。等价于\x0c@H_403_9@和\cL@H_403_9@。

\n 匹配一个换行符。等价于\x0a@H_403_9@和\cJ@H_403_9@。

\r 匹配一个回车符。等价于\x0d@H_403_9@和\cM@H_403_9@。

\s 匹配任何空白字符,包括空格、制表符、换页符等等。等价于[\f\n\r\t\v]@H_403_9@。

\S 匹配任何非空白字符。等价于[^\f\n\r\t\v]@H_403_9@。

\t 匹配一个制表符。等价于\x09@H_403_9@和\cI@H_403_9@。

\v 匹配一个垂直制表符。等价于\x0b@H_403_9@和\cK@H_403_9@。

常用的就介绍到这里,其它的需要进一步了解可以查阅手册或资料。

猜你在找的正则表达式相关文章