Vim替换
替换
Tip 87 Meet the Substitute Command
结识替换命令,:substitute
命令。其允许我们查找和替换一个文本块,语法如下:
1 | :[range]s[ubstitute]/{pattern}/{string}/[flags] |
命令很复杂.,除了要提供搜索模式和替换文本之外, 还需要指定执行的范围。另外, 还可以提供额外的标识符来调整其行为。
[range]
的使用和其他 Ex 命令一样,以逗号分隔
{pattern}
指代要查找的部分
Flags,标志位调整替换行为
几种常用的 flag 标志符:
g - 让替换命令应用到全局,可修改一行内的匹配项, 而不是仅改变第一个匹配项.
c -替换前手工确认或拒绝每一处修改,
n - 禁止替换行为, 此功能可用于统计匹配文本的数量
e - 忽略错误信息. 例如搜索没有匹配项时, 替换命令会提示一个错误信息 “E486: Pattern not found.”
& - 告知 Vim 重用上一次替换命令中的相同标志.
替换域中的特殊字符
查找模式时某些字符是有特殊意义的. 而替换字段也是有一些特殊字符的
Symbol | Represents |
---|---|
\r | 插入回车(而不是\n) |
\t | 插入 tab 键 |
\ | 插入反斜杠 \ |
\1 | 插入第一个子匹配 |
\2 | 插入第二个只匹配 (依次到 \9) |
\0 | 插入整个匹配的文本 |
& | 插入整个匹配的文本 |
~ | 使用上次的 {string} 替换文本 |
={Vim script} | 执行 {Vim脚本} 表达式, 把结果结果作为 {string} 替换文本 |
Tip 88 Find and Replace Every Match in a File
在文件范围内查找并替换每一处匹配
标志位 g 处理横轴字符,当前行所有匹配
地址符 % 处理纵轴的文本行,可理解为处理整个文件的匹配项
语法如下:
1 | :%s/content/copy/g |
Tip 89 Eyeball Each Substitution
手动控制每一次替换操作
标志位 c
手工确认每一处修改
语法如下:
1 | :%s/content/copy/gc |
引入标志位 c 后,Vim 会在每处匹配体贴地为我们提示所有的选项y/n/a/q/l/^E/^Y
。下表展示了每种答案的含义:
Keystrokes | Buffer Contents |
---|---|
y | yes 替换本次修改 |
n | no 放弃本次修改 |
q | quit 退出替换 |
l | last 本次为最后一次替换, 然后退出 |
a | all 替换本次和剩下的所有项 |
向上滚动屏幕 | |
向下滚动屏幕 |
不同于以往的是,在 Vim 的替换-确认模式下,键盘上的大多数按键都将失效。尽
管
感到陌生。
Tip 90 Reuse the Last Search Pattern
重用上次的查找模式
如果你觉得将来会以完整形式来调用历史记录中的 substitute 命令, 就要养成在查
找域中填充内容的习惯。你只需在命令行中输入 <C-r>/
,即可把上次的查找内容粘贴进来。
即留空查找域,使用<C-r>/
替代
Tip 91 Replace with the Contents of a Register
用寄存器的内容替换
通过输入 <C-r>{register}
, 我们可以将寄存器的内容插入到命令行
Tip 92 Repeat the Previous Substitute Command
重复上一次 substitute 命令
假设我们刚刚执行完以下命令(其作用范围为当前行):s/target/replacement/g
但我们失误,应该加上前缀 % 才对,接下来,我们只需输入 g&,即可在整个文件的范围内重复这条命令。
某条 substitute 命令除了没加 % 前缀之外,其余都正确的时候,不妨试一试 g&
gv 命令会激活可视模式,并重新将上次被选中的文本高亮起来(详情参考Tip 21 )进入命令行模式,此时命令行会提示为 :’<,’> 键入 &&, 第一个 :& 组合为 Ex 命令, 功能为重复最后一次替(:substitute)换命令(参考 :h :&), 而第二个 & 则表示使用前一个替换命令的标志符。