学习vi编辑器6

第六章 全局替换

全局替换真正使用的是ex的两个命令: :g(全局)和:s(替换),替换命令的语法如下:

:s/old/new/

将把当前行中模式old第一次出现修改为new./(斜杠)是命令不同部分间的分隔符(当斜杠为该行的最后一个字符时,它是可选的)

:/s/old/new/g

把当前行old的每次出现改为new,而不只是该行的第一个old.:s命令允许替换串后面带有选项.g就代表全局(g选项影响一行中的每个模式,跟:g命令是不同的)

通过在:s命令前加上地址前缀,可以把它的范围扩展到多行,例如

:50,100s/old/new/g

:1,$s/old/new/g

:%s/old/new/g

确认替换

输入u来取消任何搜索替换命令

在进行全局替换前使用:w保存文件,这样可以不保存编辑重开文件或者输入:e!

在替换前看到搜索结果和确认每个替换,则可以在替换命令的尾部加上c选项(用于确认)

:1,30s/his/the/gc

vi的n(重复上次搜索)点(.)(重复上次命令)命令的结合也是一种极为有用的方法

/which            搜索which

cwthatESC        修改为that

n                重复搜索,跳过一次修改

n                重复修改

.                重复修改(如果正确)

上下文相关替换

:%s/editer/editor/g        把文件中editer的每次出现替换为editor

:g/patern/s/old/new/g

第一个g是在文件的所有行上执行的命令,模式pattern识别要发生替换的行.在那些包含模式pattern的行上,ex将把old替换(s)为new.最后的g表示在该行上进行全部替换

如果用来进行搜索的模式与想要修改的模式相同,就不用重复它

:g/string/s//new/g

将搜索包含string的行并对string进行替换

模式匹配规则

元字符在搜索模式中的使用

[]中需要\转义的是\ - 和 ]

\<    \>    \(    \)    比较特殊

POSIX的方括号表达式

方括号内的字符组称为"括号表达式".在括号表达式中,除了像a !等那样的字面字符以外,还可以有其他的组成部分,他们是

字符类        由[:和:]包围的关键字组成,[[:alpha:]!]匹配任何一个单字母或感叹号

整理符号    被看做单一单元的多字符序列,由[.和.]所包围的字符组成,[[.ch.]]匹配ch

等价类        [[=e=]]在法语中可以匹配ēéěèe

POSIX字符类

匹配字符

[:alnum:]

字母数字字符

[:alpha:]

字母字符

[:blank:]

空格和制表符

[:cntrl:]

控制字符

[:digit:]

数字字符

[:graph:]

可打印和可见(非空格)字符

[:lower:]

小写字符

[:print:]

可打印字符(包括空白)

[:punct:]

标点字符

[:space:]

空白字符

[:upper:]

大写字符

[:xdigit:]

十六进制数字

元字符在替换串中的作用

当进行全局替换时,正则表达式只有在命令的搜索部分(第一部分)时才具有特殊含义,例如:

:%s/1\. Start/2. Next, start with $100/

后面的替换串按照字面意思处理字符.和$,而不对它们进行转义

在替换串中具有特殊含义的元字符

\n    前向引用括号包围的模式匹配串

\    把其后的字符转义,\\输出自己

&    代表与搜索模式相匹配的整个文本    :%s/abcdefg/&hij/    替换文本将是abcdefghij

\u\l

把替换串中的下一个字符分别变为大写或小写.例如:%s/\(Thant\) or \(this\)/\u\2 or \l\1/

\U或\L和\e或\E

从它们后面开始到替换串结束或到\e或\E出现为止的所有字符都转换为大些或小写,例如要把Fortran变成大写,可以输入:%s/Fortran/\UFortran/或:%s/Fortran/\U&/

输入:set ic或者:set ignorecase忽略大小写

更多的替换技巧

  1. :s:s//~/相同,即重复上次替换
  2. &表示一次替换,比如:%&g在各处重复上次替换
  3. &键也可以作为vi命令来执行:&RETURN命令比:sRETURN输入更快
  4. :~命令和:&命令相似,:~使用的搜索模式是上次任何命令所使用的正则表达式,而不局限于上次替换命令使用的正则表达式例如

    :s/red/blue/

    /green

    :~

    等价于:s/green/blue/

  5. /,可以使用除\ " |之外的任何非字母表、非空白字符作为分隔符,例如

    :%s;/user1/tim;/home/tim;g

posted on 2011-10-19 19:54  Observer  阅读(436)  评论(0编辑  收藏  举报

导航