学习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忽略大小写
更多的替换技巧
- :s和:s//~/相同,即重复上次替换
- &表示一次替换,比如:%&g在各处重复上次替换
- &键也可以作为vi命令来执行:&RETURN命令比:sRETURN输入更快
- :~命令和:&命令相似,:~使用的搜索模式是上次任何命令所使用的正则表达式,而不局限于上次替换命令使用的正则表达式例如
:s/red/blue/
/green
:~
等价于:s/green/blue/
- 除/外,可以使用除\ " |之外的任何非字母表、非空白字符作为分隔符,例如
:%s;/user1/tim;/home/tim;g