表示[]中的任意一个字符。
[]中可以用‘-’表示范围。
^表示排除[]中的所有字符。
例如:
1.“a[57]”表示a5或者a7
2.“a[a-z]x”表示aaz或者abx、acx等。
3.“a[^5a]”表示除了a5和aa都行,它可以比配a1、a6等。
^
‘^’表示以接在它后面的字符开头。
例如:
‘^#’表示匹配以#开头的行。这个操作一般能把注释的行匹配出来。
我在复制出来的inittab文件中插入了一行i love linux,结果就只有这一行打印出来了,因为其他行全是注释的。
大家还记得‘v’这个选项吗?我们在讲grep命令时提到过,它的意思是‘反向选择’,选出不包含查询字符串的行。
$
‘$’表示行尾。
例如:
每行文字结尾有个看不到的’$’
‘.’
‘.’在正则中表示任意一个字符。
例如:
‘r.t’可以表示r1t或者rat、rxt、r-t等等。
*
‘*’在正则中代表任意个字符,包括0个。
例如:
上图显示,a和aaa都匹配出来了。
.和*搭配
.和*搭配可以表示任何个任意字符。
上图中的正则的意思是,匹配包含ro,后面接任意字符知道行尾。
{}
‘{}’表示前面的字符或者组合重复n次,n也可以是一个范围。
比如:
1.a{2}:表示匹配两个a。
2.a{1,2}:表示一个或者两个a。
上面的实验和我们的理论是一致的,匹配的结果中有abcd和abbcd,但是没有abbbcd。
细心的读者可能看到ls|grep ‘ab{1,2}cd’这一行没有输出结果,这是因为‘{’不加转义会被认为是字符串:
?
‘?’表示0个或者1个,用白话说就是:有或者没有都行。
查询字符串中的‘?’也需要转移,否则也会被当成字符。
()
括号代表一个整体。
例如:a(bc){2,3}d表示匹配abcbcd或者abcbcbcd。
|
‘|’表示或者的意思,我们一般和括号连用,来表示一个边界。
比如:a(bc|de)f表示可以匹配abcf或者adef。
egrep
在查询字符串中加转移符号有时候真的挺难看。egrep就可以帮助我们解决这个问题。同样是这个命令: ls|grep -n ‘a(bc|de)f’,用grep无法匹配,用egrep就可以:
grep -E
grep -E连起来用等同于egrep。
考一考自己
看看下面这些命令,你都知道是什么意思吗?上机验证一下吧。
做实验请务必用源文件的副本。我就是把文件复制到/tmp目录下操作的。