linux shell 以一串字符作为表达式向系统传达意思。元字符(metacharacters)是用来阐述字符表达式意义的字符,简言而之,元字符就是描述字符的字符,它用于对字符表达式内容,转换及各种操作信息进行描述。正则表达式是由一串字符和元字符构成的字符串,简称RE(Regular Expression)。正则表达式的主要功能是文本查询和字符串操作,它可以匹配文本的一个字符或字符集合。
在linux系统中,程序设计语言java、prel 和python等,shell 工具sed、awk和grep 等、mysql和postgresql等数据服务器都使用了正则表达式,图描述了正则表达式用于数据流处理的过程,实际上,正则表达式完成了数据过滤,将不满足正则表达式定义的数据拒绝掉,剩下与正则表达式匹配的数据。
正则表达式的基本元素包括普通字符和元字符,例如, a、b、1、2 等属于普通字符,普通字符可以按照字面意思理解,如:a只能理解为英文的小写字母a,没其他他隐藏的含义。而*、^、[]等元字符,shell 赋予了它们超越字面意思的意思,如,*符号字面的意思也就是一个符号,但实际上却表示了重复前面的字符0此或多次的隐藏含义。因此,掌握正则表达式基本元素主要是对正则表达式中元字符意义的掌握。
POSIX标准将正则表达式分为两类:基本的正则表达式和扩展的正则表达式,大部分linux应用和工具仅支持基本的正则表达式,因而,本节所述的正则表达式基础是掌握正则表达式的关键,正则表达式中元字符集合及其意义。如下图:
符 号 | 意 义 |
* | 0个或多个在*字符之前的那个普通字符 |
. | 匹配任意字符 |
^ | 匹配行首,或后面字符的非 |
$ | 匹配行尾 |
[] | 匹配字符集合 |
\ | 转义符,屏蔽一个元字符的特殊意义 |
\<\> | 精确匹配符号 |
\{n\} | 匹配前面字符出现n次 |
\{n,\} | 匹配前面字符至少出现一次 |
\{n,m\} | 匹配前面字符出现n~m次 |
我们来逐个学习介绍正则表达式元字符的意义和用法,并列举一些例子结合使用元字符集合。
1."*" 符号
“*” 符号用于匹配前面一个普通字符的0次或多次重复,如:
图1-1 : “*”符号的意义 hel*o |
“*” 符号前面的普通字符是1,*字符就匹配1字符0次或多次,如果字符串helo.hello. helllo 都可以有hel*o 来表示。
2. “.”符号
点好“.”用于匹配任意一个字符,如:
图1-2: "." 符号的意义 ...73 |
由于“.” 符号只能匹配一个字符,因此,上述字符串表示前面三个字符为任意字符,第4和第5个字符是7和3,最后一个字符为任意字符,如xcb738、4J973U都能匹配上述字符串。
3.“^”符号
图1-3:^符号的意义 ^cloud |
这表示匹配以cloud 开头的行。结合上面介绍的“*”符号和“.”符号,再举一个例子:
图1-4:^符号、.符号和*符号结合使用 ^...x86* |
该字符串表示行首的三个字符为任意字符(可以使空格),第4~6个字符为x86,第7个字符开始可以重复匹配6,如:866x86666、8 6x86都可以匹配上述字符串。
4.“$”符号
$符号匹配行尾,$符号放在匹配字符之后,与“^”符号的功能和用法都想反,如:
图1-5:$符号的意义 micky $ |
该正则表达式表示匹配以michky结尾的所有行。一个特殊的正则表达式是匹配所有空行的表达式,为:
图1-6:空行的表示方法 ^$ |
该正则表达式既匹配行首,又匹配行尾,中间没有任何字符,因此,为空行。读者需要牢记1-6图所示的空行表示方法,很多命令都用到这个正则表达式来表示空行。
如果需要匹配只包含一个字符的行,如下图1-7所示:
图1-7 :包含一个字符的行 ^.$ |
5."[]" 符号
方括号[]匹配字符集合,该符号支持穷举法列出字符集合的所有元素,也支持使用“-”符号表示字符集合的范围,表面字符集范围从“-”左边字符开始,到“-”右边字符结束。如果匹配任意一个数字,可以使用如图1-8所示的两种方法,前一种穷举了阿拉伯数字,后一种用数字范围表示,显的比较简洁。
图1-8:匹配任意一个数字 [0123456789] [0-9] |
"[]"也可以用字母匹配,例图1-9 给出了匹配字母的例子:
图1-9:匹配字母 [a-z] #所有小写字母 [A-Z] #所有大写字母 [b-p] #小写字母b~p |
linux系统对大小写是敏感的,并且支持字母排序,因此,linux中有大写字母序列和小写字母序列,两者是分开的。 图1-9中a~z表示所有的小写字母,A~Z表示所有的大写字母,而b-p表示从b到p之间所有的小写字母。
我们知道,"^"符号表示匹配行首,但是,“^”符号放到“[]”符号中就不再表示匹配行首了,而是表示取反符号,请看下面的如图1-10.
图1-10: ^表示取反 [^ b-d] |
待续。。。。。。。。。