正则表达式一般用来匹配文件中的特定文本,但需要配合其他工具使用.
1.例子 egrep '^(abc|def):' file
^用来表示一行的开头,()内部是多选结构,|表示或的意思,:则只代表:这个字符,单引号限定范围,以避免shell把引号内部的正则表达式当命令执行,file则表示要搜索队文件.
综合起来,上面的例子表示: 在file这个文件中,搜索每一行,碰到行的开头是abc:或def:的,就打印出来.
2.例子 egrep '^[abcdef]:' file
^用来表示一行的开头,[]内部是字符组,与()不同,[]内部每个字符都表示一个待匹配目标,此例中,即分别匹配a,b,c,d,e,f这六个字符.
综合起来,上面的例子表示: 在file这个文件中,搜索每一行,碰到行的开头是a,b,c,d,e,f这六个字符其中一个,就打印出来.
3.( | ) 与 [ ] 的 区别
(str1|str2) 匹配str1或str2其中一个.
[ABCD] 匹配A,B,C,D其中一个.
[A-Za-z0-9_!.?] 匹配A到Z,a到z,0到9,以及_!.?四个字符中的一个.
H(str1|str2) 匹配Hstr1或Hstr2其中一个.
H[A-Za-z0-9_!.?] 匹配H后接A到Z,a到z,0到9,以及_!.?四个字符中的一个.
综合来说,[]内只匹配其中一个字符,(|)内匹配|两边的任意一个字符串.
4.^的不同位置的区别
在[]外部,^表示一行的开头,在[]内部,^表示排除后面接的字符,如:
^[abc] 匹配以a,b,c开头的每一行
[^abc] 匹配除a,b,c之外的每一个字符,但不包括空格
[^ ] 匹配除空格外的任何一个字符
(^str1|str2|str3) 匹配一个以str1开头的行,或包含str2的行,或包含str3的行
(^str1|^str2|^str3) 匹配以str1或str2或str3开头的行
5.^及$
^在一般匹配一行的开头(或用来作为排除型字符),$匹配一行的结尾
^cat$ 行开头,然后是cat,再然后是行结尾,即只包含cat的行
^cat 行开头,然后是cat,即以cat开头的行
cat$ cat,然后是行结尾,即以cat结尾的行
^ 行开头,这个没什么意义,因为每行都有开头
$ 同上
^$ 行开头,然后是行结尾,匹配一个空行
6.一些元字符
.号用来匹配任意字符,\.则表示只匹配.这个字符.
-号用来表示一个范围,如0-9就表示0到9,\-则只表示匹配-这个字符
在[]字符组内部,如果-在第一个位置,则不表示连字符,只匹配-这个字符,如果^在第一位,则表示排除型字符,如果^不在第一位,或\^,则只匹配^这个字符.
7.单词分界符(egrep)
\< 匹配单词的开头
\> 匹配单词的结尾
'\
'b\>' 以b结尾的单词
'\<3.*7\>' 以3开头,中间有若干字符,以7结尾的单词(无意义,因为.可以匹配空格)
单词分界符在不同的工具里,有不同的表示,egrep中以"\<和\>"表示,perl中用"\b"表示
8.?可选项元素
?号用来匹配一个可有可无的字符,如:egrep?可以匹配egre或egrep,即这个?表示,他前面的p可有可无.
e(grep)? 匹配e或egrep,即这个grep可有可无
ma(x|sh)? 匹配ma或max或mash
ma[a-z]? 匹配ma或ma[a-z]
9.量词*和+
(str)* 匹配0个或多个str,即*号匹配前面的字符串,可以匹配0个或多个,最少匹配0个
(str)+ 匹配1个或多个str,即+号匹配前面的字符串,可以匹配1个或多个,最少匹配1个
e(a)* 匹配e或ea或eaaaaaaa,即*可以匹配0个a,或N多个a
e(a)+ 匹配ea或eaaaaa,但不匹配e,即+可以匹配1个a,或N多个a,必须匹配一个
e * 匹配0个或多个空格
e + 匹配1个或N个空格
10.区间
(str){min,max} 匹配最少min个str,最多max个str
e{1,5} 匹配e或ee或eee或eeee或eeeee