Shell编程之正则表达式与通配符

253 阅读2分钟

Shell编程之正则表达式与通配符

正则表达式和通配符的应用场景

  • 正则表达式用来在文件中匹配符合条件的字符串,正则是包含匹配(重点!!!!)。grepawksed等命令可以支持正则表达式。

  • 通配符用来匹配符合条件的文件名,通配符是完全匹配ls,findcp这些命令不支持正则表达式,所以只能使用shell自己的通配符来进行匹配了。

绝大多数的语言都支持正则表达式,但是不一定有通配符的概念


通配符

* 匹配任意内容

[ root@ localhost ~] # ls can*
cangls canyls

? 匹配任意-个内容

[ root@localhost ~]# ls can?ls
cangls canyls
[ root@localhost ~]# ls can???
cangls canyls

[] 匹配中括号中的一个字符

[ root@localhost ~]# ls can[gy]ls
cangls  canyls

基础正则表达式

* 匹配0次或者任意多次

例如:a* 会匹配任意的字符串,而aa*只会匹配以a开头的字符串,依次类推aaa*,匹配以aa开头的

. 匹配除了换行符外的任意字符

类似于通配符中的?,只匹配一个字符;例如s..d,匹配sood,suid,而不匹配soood(s.*d可以表示)

^和$

^匹配行首,$匹配行位 ;

^M:以M开头的字符串;

M$:以M结尾的行;

^$:匹配空白行

[] 匹配中括号中指定的任意一个字符,只匹配一个字符

s[ao]id:匹配s和字母中,要不是a、要不是o [0-9]:匹配任意-个数字 ^[a-z]:匹配用小写字母开头的行

[^]匹配除中括号的字符以外的任意-个字符

^[^a-z]:匹配不用小写字母开头的行 ^[^z-zA-Z]:匹配不用字母开头的行,在某些操作系统上(不包括Linux)与^[^A-z]效果相同

\ 转义符(让特殊符号丧失其特殊功能)

例如想找出以.结尾的字符串,不能用.$ (这代表了以任意字符结尾的字符串),而是应该使用\.$

\{n\} 表示其前面的字符恰好出现n次

a\{3\}:匹配包含a字母连续出现3次的字符串 [0-9]\{3\}:匹配包含连续的三个数字的字符串

如果只想截取3个的话,就需要加定界符(下面的这两种同样是需要,否则数量限制也没有意义),既在重复字符的前面后面加上一些指定的字符

\{n,\}表示其前面的字符出现不小于n次

^[0-9]\{3,\}[a-z]:匹配最少用连续E 三个数字开头的行

\{n,m\} 匹配其前面的字符至少出现n次,最多出现m次.

sa\{1,3\}i:匹配在字母s和字母i之间有最少一个a,最多三个a


参考课程:慕课网-shell编程之正则表达式