分类: LINUX
2007-06-06 11:43:44
正则表达式常用于文本过滤,它可以辅助grep awk sed这些工具来做相对应的匹配。
包括:匹配行首与行尾
匹配数据集
匹配字母或者数字
匹配一定范围内的字符串集
^ 只匹配行首
$ 只匹配行尾
* 一个单字符后跟* ,匹配0或多个此单字符
[] 匹配[]内的字符,也可以是一个单字符,也可以是字符序列号。可以使用[1-5]来代替[12345]
\ 用来屏蔽一个元字符的含义,因为元字符在shell中有特殊含义。\可以来屏蔽这些元字符的特殊含义
. 任意单个字符
abc\{n\} 用来匹配前面abc出现的次数,n表示出现的个数
abc\{n,\} 匹配前面abc出现最少n次
abc\{n,m\} 匹配前面abc出现n至m次
--------------------
M.Tansley 05/99 48311 Green 8 40 44
J.Lulu 06/99 48317 green 9 24 26
P.Bunny 02/99 48 Yellow 12 35 28
J.Troll 07/99 4842 Brown-3 12 26 26
L.Tansley 05/99 4712 Brown-2 12 30 28
-------------------
. 匹配任意单个字符
# grep ..T grade.txt //匹配前2个是任意字符,第三个是T的行
^ 匹配行首
# ls –l | grep ‘^d’ //以d开头的文件(目录)
# grep ‘^J’ grade.txt //匹配以J开头的行
# grep ‘^L’.T grade.txt //以L开头第二个字符是任意字符第三个字符是T的行
$ 匹配行尾
# grep ‘$
# grep ‘^$’ grade.txt //匹配空行
# grep ‘^.$’ grade.txt //匹配一个字符
* 匹配字符串中的单个字符或重复序列
# grep ^.* grade.txt //匹配任意字符
\ 使用屏蔽一个特殊字符的含义
有时需要查找一个字符或者字符串,而这些字符串中包含了特殊字符
特殊字符包括:
$ . ‘ “” * ^ [ ] | ( ) \ + ?
如果我们要屏蔽这些特殊字符我们就要在这些特殊字符前面加上\
# echo “\”hello world\””
[] 匹配一个范围或者集合
[A-Z] [a-z] [0-9] [A-Za-z0-9]
# grep ‘^[A-Z]\.[T]’ grade.txt \\匹配以大写字母开头第二个字符是点第三个字符是大写T的行
注意:
如果^放在[]中表示否定或不匹配的内容
# grep ‘^[A-Z]\.[^T]’ grade.txt
使用\{\}来匹配模式结果出现的次数
例:
AB
AAB
AAAB
AAAAB
AAAAAB
A\{2\}B //查看A出现2次并以B结尾的行
A\{2,\}B //查看A出现最少2次并以B结尾的行
A\{2,4\}B //查看A出现2到4次之间的以B结尾的行
例:
1234XC9088
4523XX9001
0011XA9912
9931XC3445
[0-9]\{4\}.[C][0-9]\{4\}
//匹配数字出现4次
后跟一个任意字符,和一个大写C
再匹配数字出现4次的行
练习:
写出一个匹配e-mail的正则表达式
grep和正则表达式的使用
grep允许使用国际字符模式:
[:upper:] = [A-Z]
[:lower:] = [a-z]
[:digit:]] = [0-9]
[:alnum:] = [0
[:space:] = 空格或tab键
[:alpha:] = [A-Za-z]
egrep 代表extend grep egrep接受所有正则表达式,而且egrep可以以一个文件作为保存的字符串,然后将他传递给egrep egrep用-f 参数来跟后面的文件
egrep –f f2 date.txt