Shell编程之正则表达式与通配符
正则表达式和通配符的应用场景
-
正则表达式用来在文件中匹配符合条件的字符串,正则是包含匹配(重点!!!!)。
grep
、awk
、sed
等命令可以支持正则表达式。 -
通配符用来匹配符合条件的文件名,通配符是完全匹配。
ls,find
、cp
这些命令不支持正则表达式,所以只能使用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编程之正则表达式