什么是正则表达式
正则表达式并不是一个工具程序,而是一种字符串处理的标准依据,如果要想用正则表达式来处理字符串,就要用支持正则表达式的工具。正则表达式是处理字符串的方法,它是以行为单位来进行字符串的处理行为,正则表达式通过一些特殊符号的辅助,可以很容易得达到查找、删除、某特定字符串的处理。通常情况下正则表达式分为基础正则表达式和扩展正则表达式。
正则表达式和bash的通配符(wildcard)是两个完全不同的概念,通配符是代表bash环境接口的一个功能。关于通配符的简单介绍,可以参考另一篇博文”bash环境中的通配符和特殊符号的简单介绍“。
语系对正则表达式的影响
不同的语系,字符的编码顺序可能不同,当对字符操作的时候,就会有不同的结果。
例如。LANG=C时;0 1 2 3 ... A B C D ... Z a b c d ...z
LANG=zh_CN时;0 1 2 3 ... a A b B c C d D ... z Z 如果你要用[a-z]来选择全部的小写字符的时候,就会得到不同的结构。 为了避免上面的这种编码顺序所造成的问题,当我们使用正则表达式的时候,有一些特殊的符号我们可以使用。
特殊字符 | 代表意义 |
---|---|
[:alnum:] | 使用英文大小写字符及数字,即 0-9,A-Z,a-z |
[:alpha:] | 代表任何英文大小写字符,即 A-Z,a-z |
[:blank:] | 代表空格键与[Tab]按键 |
[:cntrl:] | 代表键盘上的控制按键,即包括CR,LF,Tab,Del...等等 |
[:digit:] | 代表数字,即 0-9 |
[:graph:] | 除了空格符(空格键与[Tab]按键)外的其他所有按键 |
[:lower:] | 代表小写字符,即 a-z |
[:print:] | 代表任何可以打印出来的字符 |
[:punct:] | 代表标点符号(punctuation symbol),即: : ' ? ! ; : # $ |
[:upper:] | 代表大写字符,即 A-Z |
[:space:] | 任何会产生空白的字符,包括空格键,[Tab],CR等等 |
[:xdigit:] | 代表16进制的数字类型,包括:0-9,A-F,a-f的数字与字符 |
基础正则表达式(BRE)字符介绍
RE字符 | 说明 | 例子 |
---|---|---|
^string | 待搜索的字符串(string)在行首 | 搜索行首为#的行 $grep '^#' test.txt |
string$ | 待搜索的字符串(string)在行尾 | 搜索行尾为!的行 $grep '!$' test.txt |
. | 代表一定有一个任意字符 | 搜索[e一个任意字符e] $grep 'e.e' test.txt |
\ | 转义字符,将特殊符号转义成一般字符 | 搜索含有单引号'的行 $grep \' test.txt |
* | 重复0个到无穷多个前一个RE字符 | 搜索含有er err errr等等的字符串 $grep 'err*' test.txt |
[list] | 中括号中只代表一个待搜索的字符 | 搜索含有agt,agr,agx的行 $grep 'ag[trx] test.txt |
[n1-n2] | 中括号中列出想要搜索的字符范围 | 搜索含有数字的行 $grep '[0-9]' text.txt |
[^list] | 中括号中列出不要的字符串或者范围 | 搜索的行中含有xx*,但是不能含有xxy $grep 'xx[^y]' test.txt |
\{n,m\} | 连续n到m个前一个RE字符 | 搜索含有good或者goood字符串的行 $grep 'go\{2,3\}d' test.txt |
一些基础正则表达式例子:
[root@rhel6164 ~]# grep '[^a-z]oo' test.txt
#打印oo前面不含小写字母的行
[root@rhel6164 ~]# grep '[^[:lower:]]oo' test.txt
#因为上面表示的小写字母有可能会因为语系不同编码造成影响,可以用第二个命令
[root@rhel6164 ~]# grep '^$' test.txt
# 打印出空白行
[root@rhel6164 ~]# grep '.*oo' test.txt
# .*表示任意字符,打印oo前面含有任意字符的行
特别注意*,表示重复前一个0到无穷多次的意思,为组合形态。例如e*就代表空字符或者一个e以上的字符。特别要注意是允许空字符。$grep 'e*' text.txt将会把所有的行都会打印出来。
扩展正则表达式(ERE)字符介绍
RE字符 | 说明 | 例子 |
---|---|---|
+ | 重复一个或一个以上的前一个RE字符 | 搜索g含有od,good,goood...的字符串的行 $egrep 'go+d' test.txt |
? | 0个或一个的前一个RE字符 | 搜索含有gd,god两个字符串的行 $egrep 'go?d' test.txt |
| | 用或(or)的方式找出来的字符串 | 搜索含有gd或good两个字符串的行 $egrep 'gd|god' test.txt |
( ) | 找出群组字符串 | 搜索含有glad或good字符串的行 $egrep 'g(la|oo)d test.txt |
( )+ | 多个群组的判别 | 搜索含有AxyzxyzxyzC字符串的行 $egrep 'A(xyz)+C' test.txt |