Linux shell 正则表达式
正则表达式是一种可以用于模式匹配和替换的工具,可以让用户通过使用一系列的特殊字符构建匹配模式,然后把匹配模式与待比较字符串或文件进行比较,根据比较对象中是否包含匹配模式,执行相应的程序。
1.一般通配符
通配符用于模式匹配,如文件名匹配、路径名搜索及字符串搜索等。常用的通配符有6种。
● *(星号)
可匹配任意字符的0次或多次出现。例如,f*可以匹配f、fa、fb、fa3、fff、ff.s 等,即匹配以f打头的任意字符串。但应注意,文件名前面的圆点(.)和路径中的斜线(/)必须显式匹配。例如,模式*file 不能匹配.profile,而.*file才可匹配.profile。模式/etc*.c不能匹配在/etc 目录下带有后缀.c的文件,而模式/etc/*.c 会匹配这些文件。
● ?(问号)
可匹配任意一个字符。例如,f?可以匹配f1、f4、fv等,但不能匹配f、facd、f34等。
● [ ](一对方括号)
其中有一个字符组。其作用是匹配该字符组所限定的任何一个字符。例如,f[adefu]可以匹配fa,fd,fe,ff,fu,但不能匹配f1,fa3,fkk等。方括号中的字符组可以由直接给出的字符组成,如上面所示,也可以由表示限定范围的起始字符、终止字符及中间一个连字符(-)组成。例如,f[a-d]与f[abcd]的作用相同。又如,a[1-9]与a[123456789]的作用相同。但前者的表示方式更简捷。
连字符仅在一对方括号中表示字符范围,如在方括号外面就成为普通字符了。但是,前面介绍的*和?在一对方括号外面是通配符,若出现在方括号内,它们就失去通配符的能力,成为普通字符了。例如,模式-a[*?]abc中只有一对方括号是通配符,因此,它匹配的字符串只是-a*abc 和-a?abc。 | |
● !(感叹号)
如果它紧跟在一对方括号的左方括号([)之后,则表示不在一对方括号中所列出的字符。例如,f[!1-9].c表
示以f打头,后面一个字符不是数字1~9的.c文件名,它匹配fa.c,fg.c等。
在一个正则表达式中,可以同时使用*(星号)和?(问号)。例如,/usr/meng/t?/*匹配目录/usr/meng之下,子目录名是以t打头,后随一个任意字符的这些子目录下的所有文件名。
又如,chapter[0-9]*表示chapter之后紧跟着0个0~9的数字,其后字符是任意字符,它可匹配chapter10,chapter0,chapter1,chapter29等。
● ^(幂次方号)
只允放在一行的开始匹配字符串。例如,“ls -.l ^d”显示所有的目录。
$(美元号)
只在行尾匹配字符串,它放在匹配单词的后面。例如,linux$表示以单词linux结尾的所有文件。
2.模式表达式
模式表达式是那些包含一个或多个通配符的字符串。bash 除支持Bourne shell 中的*、?、[ ]、!、^及$通配符外,还提供了特有的扩展模式匹配表达式。
● *(模式表)
匹配给定模式表中“模式”的0次或多次出现,各模式之间以竖线(|)分开。例如,file*(.c|.o)匹配文件file.c、file.o、、、、file等,但不匹配file.h、file.s等。
● +(模式表)
匹配给定模式表中“模式”的1次或多次出现,各模式之间以竖线(|)分开。例如,file+(.c|.o)匹配文件file.c、file.o、、 等,但不匹配file。
● ?(模式表)
正则匹配问号匹配模式表中任何一种“模式”的0次或1次出现,各模式之间以竖线(|)分开。例如,file?(.c|.o)只匹配file、file.c、file.o等,不匹配、等。
● @(模式表)
仅匹配模式表中给定“模式”的1次出现,各模式之间以竖线(|)分开。例如,file@(.c|.o)只匹配file.c 和file.o,但不匹配file、、等。
● !(模式表)
除给定模式表中的一个“模式”之外,它可以匹配其他任何的字符串。在实际使用时,模式表达式可以递归,即每个表达式中都可以包含一个或多个模式。例如,file*(.[cho]|.sh)是合法的模式表达式。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论