转载地址:http://blog.csdn.net/shuangde800/article/details/11016579


本文是在学习《使用vi编辑器, Lamb & Robbins编著》时在所记的笔记。


本文内容:

模式匹配规则(正则表达式)

元字符

模式匹配举例



本文约定:

$ + 命令 表示在普通的bash的命令行下

:  + 命令 表示在vim的ex(命令)模式, 按"Ctrl" + ":" 进入


------------------------------------------------------------------------------------------------




搜索模式的元字符

进行全局替换时,不仅可以使用固定的字符串,还允许是搜索由正则表达式指代的可变的单词模式。

当你指定一个字面的字符串时,搜索可能会找到不想匹配的其他实例。

例如,在文件搜索单词时,单词可以有不同的使用方式。正则表达式有助于在上下文中搜索单词。要注意正则表达式可以与vi的搜索命令/?以及ex中的:g:s命令一起使用。

正则表达式由普通字符和许多称为元字符的专用字符结合在一起组成,元字符及其使用方法如下所示。 


 



元字符 用法
 .(点)

匹配除换行符之外的任何一个单个字符。空格也将作为字符。

例如p.p可以匹配pep,pip和pcp.(任意字符

  *(星号)

星号前面的一个字符可以出现0次或多次

例如,bugs*将匹配bugs,bugss或bug。

*可以跟任何元字符。例如,由于.(点)代表任何字符,因此 .* 表示“匹配任意数量的任何字符”。   

:s/End.*/End/  会删除End后面的所有字符

  ^

 当处在正则表达式的第一位时,它要求后面的正则表达式要出现在一行的开始

例如,^Part可以匹配Parter,Partxx,但是不能匹配HeParter; ^...匹配一行的前三个字符。当^不在正则表达式的开始时,^只代表本身。

  $

  当处于正则表达式的最后一位时,它要求前面的正则表达式要出现在一行的结尾

  例如,here$可以匹配where, 但是不能匹配whoherehe。当不在结尾时,$就代表它本身。

   \   这是转义字符,可以把后面的元字符看成普通字符。例如\.表示一个普通的字符点, \*表示普通字符星号, \\可以获得真正的反斜杆(\)。
  [ ]    

 匹配方括号中字符的任意一个。 

例如[AB] 将匹配A或B,p[aeiou]t,匹配pat,pet,pit,pot或put。可以通过使用连字符(-)来指定范围。例如,[A-Z]匹配字母A到Z之间的任意一个大写字母。[0-9]将匹配数字0到9之间的任意一个数字。

可以在方括号内包括多个范围,也可以把范围和单独的字符混合在一起。例如[:;A-Za-z()]将匹配四种不同的标点符号和所有的字母。

大部分元字符都将在方括号内失去它们的特殊含义,因此如果想把它们作为普通字符使用,就不需要对它们进行转义。在方括号内仍需要转义的三个元字符是\-。连字符(-)的含义是范围说明符,如果要使用真正的连字符,也可以将其放在放括号内的第一个字符位置。

插入符号(^)只有它在方括号内为第一个字符时才有特殊含义,但是这种情况下其含义与通常^元字符的含义不同。作为方括号的第一个字符,^使它们的含义反过来:将匹配不在方括号里的任何一个字符。例如,[^a-z]将匹配任何不是小写字母的字符。

 ()   

 把()之间的模式保存到专门的存储空间(存储缓冲区)中,单一行最多可以保存9个模式。例如,要把this or That改为That or this

:%s/this or That/\2 or \1/   \2和\1是对缓冲区的引用

 \<和\>    在单词的开始(\<)或结尾(\>)匹配字符。单词的开始或结束由标点符号或空格决定。

例如: \将匹配以ac结尾的单词(单词边界

 ~

 匹配上一次搜索中使用任何正则表达式

如果搜索过The,那么可以使用/~n来搜索Then。可以把~等价与上次的The,再加上n组合成Then


上面只是一些很基本的正则表达式,除此之外还有很多拓展的正则表达式语法。


元字符在替换串中的使用

当在进行全局替换时,上面的正则表达式之有在命令搜索的部分有特殊含义,在替换串中是按照字符原来的意思来的。

例如,

:%s /hello/$.^/   会把hello替换成$.^,$.^在这里没有特殊含义,不需要用转义(用了也可以)


替换串中的元字符

元字符 用法
 \   转义
 &

用在替换串,它代表与搜索模式想匹配的整个文本,即“重现”搜索串。这在试图避免重复输入文本时很有用。(匹配的内容

例如,

:%s/hello/&, world/    将会把hello替换成hello, wolrd

:%s/.*/(&)/   将会把所有行用()包含起来

 ~    

 用在替换串中,重复上次的替换串。例如,

上次使用$ s/his/their/     把his改为their

这次使用$ s/her/~/         会把her改为their

 \u或\l

 把替换串中的下一个字符分别变成大写或者小写。例如,

:s/yes, sir/\uyes, \usir/g   把yes, sir变成Yes, Sir

\U 或 \L

 将跟在后面的匹配串全部变成大写或小写。例如,

:s/world/\U&/   把world变成WORLD

以上是基本的正则表达式,还有很多拓展的正则表达式。


更多的替换技巧

  • :s:s//~/相同,都是重复上次替换

  • 可以把&看作是“同一事情”的意思(与匹配的文本)。

  • &键也可以作为vi命令来执行:&命令(按shift + &),即重复上次替换。

  • :~:&(或shift+&)类似,~是重复上次任何命令中所使用的正则表达式,而不仅仅是替换命令。

  • 除了/字符外,还可以使用除反斜杆,双引号和竖直线(\、"和|) 之外的任何非字母表、非空白字符作为分隔符,在对路径名进行修改时,这点尤其便利: :%s ; /user1/tim;/home/time;g  把/user1/tim改为/home/time


模式匹配举例

1. 加入要把一个文件内的所有child替换为children,如果直接用

:%s/child/children/g

可能会有问题,因为把children和Faichild这样的单词中的"child"部分替换为了children,可以用\<和\>来表示“只有该模式是个完整的单词”,

:%s/\/children/g


搜索单词的常规类

假设你的子函数名以前缀mgi、mgr和mga开头,例如:

mgibox routine,

mgrbox routine,

mgabox routine,

既想保留前缀,又想把box改为square,那么下面两个替换命令都可以完成:

1):g/mg[ira]box/s//mg\1square/g

2):g/mg[ira]box/s/box/square/g




vim统计所选区域单词数,字符数····

  1. 选择需要统计的文本

  2. 按下 g