第六章 全局替换
全局替换真正使用的是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
cwthat ESC 修改为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 命令比 :s RETURN 输入更快
-
:~ 命令和 :& 命令相似 , :~ 使用的搜索模式是上次 任何命令 所使用的正则表达式 , 而不局限于上次替换命令使用的正则表达式例如
:s/red/blue/
/green
:~
等价于 :s/green/blue/
-
除 / 外 , 可以使用除 \ " | 之外的任何非字母表、非空白字符作为分隔符 , 例如
:%s;/user1/tim;/home/tim;g