LinuxShell——正则表达式
linuxshell——正则表达式
摘要:本文主要学习了shell中的正则表达式。
简介
含义
正则表达式,也称作正规表示法,是用于描述字符排列和匹配模式的一种语法规则,它主要用于字符串的模式分割、匹配、査找及替换操作。
正则表达式是用来匹配文件中的字符串的方法,它会先把整个文本分成一行一行的字符串,然后从每行字符串中搜索是否有符合正则表达式规则的字符串,如果有则匹配成功,如果没有则匹配失败。
正则表达式和通配符的区别
正则表达式用来在文件中匹配符合条件的字符串,通配符用来匹配符合条件的文件名。其实这种区别只在shell中适用,因为用来在文件中搜索字符串的命令,如grep、awk、sed等可以支持正则表达式,而在系统中搜索文件的命令,如ls、find、cp等不支持正则表达式,所以只能使用shell自己的通配符来进行匹配了。
语系对正则表达式的影响
不同环境下语系不同,可能使用正则表达式选取的结果也会有所差异。
使用之前设置语系:
1 [root@localhost ~]# export lang=c 2 [root@localhost ~]# export lc_all=c
元字符
在正则表达式中,我们把用于匹配的特殊符号又称作元字符。在shell中,元字符又分为基础元字符和扩展元字符。
基础元字符
1 *:前一个字符匹配0次或任意多次。 2 .:匹配除换行符外的任意一个字符。 3 ^:匹配行首。例如:^hello会匹配以hello开头的行。 4 $:匹配行尾。例如:hello&会匹配以hello结尾的行。 5 []:匹配中括号里的任意一个字符,而且只匹配一个字符。例如:[aoeiu]匹配任意一个元音字母,[0-9]匹配任意一位数字,[a-z][0-9]匹配由小写字母和一位数字构成的两位字符。 6 [^]:匹配除了中括号里的字符以外的任意一个字符。例如:[^0-9]匹配任意一位非数字字符,[^a-z]匹配任意一位非小写字母。 7 \:转义符,用于取消特殊符号的含义。 8 \{n\}:表示其前面的字符恰好出现n次。例如:[0-9]\{4\}匹配4位数字,[1][3-8][0-9]\{9\}匹配手机号码。 9 \(n,\}:表示其前面的字符出现不少于n次。例如:[0-9]\{2,\}匹配两位及以上的数字。 10 \{n,m\}:表示其前面的字符至少出现n次,最多出现m次。例如:[a-z]\{6,8\}匹配6到8位的小写字母。
1)*
正则表达式中的“*”和通配符中的“*”含义不同,正则表达式中的代表前一个字符重复0次或任意多次。
举例:
“a*”并不是匹配a后面的任意字符,而是可以匹配所有内容,包括空白行,所以“a*”是没有意义的。
“aa*”会匹配至少包含一个a的字符串。
“a*b”并不能匹配a和b之间有任意字符的字符串,只能匹配包含了b的字符串。
2).
正则表达式中的“.”只能匹配一个字符,这个字符可以是任意字符。
举例:
“a.b”会匹配a和b之间有一个字符的字符串。
“a.*b”会匹配a和b之间有任意字符的字符串。
3)^
正则表达式中的“^”代表匹配行首。
举例:
“^m”会匹配以“m”开头的行。
4)$
正则表达式中的“$”代表匹配行尾。
举例:
“n$”会匹配以“n”结尾的行。
5)[]
正则表达式中的“[]”会匹配中括号里指定的任意一个字符,注意只能匹配一个字符。
举例:
“[ao]”要么匹配一个a字符,要么匹配一个o字符。
“[a-z]”会匹配任意一个大写字母。
6)[^]
正则表达式中的“[^]”会匹配除了中括号里的字符以外的任意一个字符。
举例:
“^[^a-za-z]”会匹配不以字母开头的行。
7)\
转义符会取消特殊符号的含义,将其作为正常的字符串来匹配。
举例:
“.$”不能匹配使用.结尾的行,因为.有特殊含义,可以使用“\.$”来匹配使用.结尾的行。
8)\{n\}
正则表达式中的“\{n\}”表示其前面的字符恰好出现n次。
举例:
“a\{3\}”会匹配a字母连续出现3次的字符串,但不会限制之后的字符串,当然也会匹配到“aaaa”。
“a\{3\}[^a]”会匹配a字母连续出现3次的字符串,并且之后不为a的字符串,也就是只匹配a字母连续出现3次的字符串。
9)\{n,\}
正则表达式中的“\{n,\}”表示其前面的字符出现不少于n次。
举例:
“^[0-9]\{3,\}”会匹配最少连续3个数字开头的字符串。
10)\{n,m\}
正则表达式中的“\{n,m\}”表示其前面的字符出现不少于n次,不超过m次。
举例:
“ao\{1,3\}e”会匹配在字母a和字母e之间最少1个、最多3个的o字符串。
扩展元字符
在正则表达式中还有一些元字符,被称为扩展元字符。有的命令支持这种元字符,比如awk命令,有的命令不支持这种元字符,比如sed命令和grep命令。
1 +:前一个字符匹配1次或任意多次。例如:a+b匹配以a开始以b结尾的字符串。 2 ?:前一个字符匹配0次或1次。例如:a?b匹配ab或者b。 3 |:匹配两个或多个分支选择。例如:a|b|c匹配a或者b或者c。 4 ():匹配其整体为一个字符,即模式单元。可以理解为由多个单个字符组成的大字符。例如:(abc)+会匹配重复abc这个整体一次或多次的字符串。