vim的替换

rootdream 2019-07-01

本文约定:
$ + 命令 表示在普通的bash的命令行下
:  + 命令 表示在vim的ex(命令)模式, 按"Ctrl" + ":" 进入

替换命令的基本语法

:s + / + 被替换的内容 + / + 替换的内容 ( + 分隔符 + 模式 ) (其中:s(s表示switch,替换))

当前中模式old的第一次出现修改为new

:s / old / new /   (当斜杆为该行的最后一个字符时,可不写)

当前行old的每次出现改为new

:s / old / new / g
:s命令允许替换串后面带有选项,g选项影响一行中的每个模式,不要把它与影响文件中所有行的:g命令混淆

多行old的每次出现改为new

通过在:s命令前加上地址前缀,可以把它的范围扩展到多行。例如下面命令把50行到100行的old的每次出现都改为new:
:50, 100 s / old / new / g

特别的,从第一行到最后一行的多行即为整个文件
两种方式
:1, $s / old / new / g
我们知道%等价于1,$,所以上行命令也可以这样写:
:% s / old / new / g

替换前需确认

在替换命令尾部加上c (confirm用于确认),在替换每个old前都会提示并确认:
:1, 30 s /old/new/ gc
将会出现提示replace with hehe (y/n/a/q/l/^E/^Y)?  
y替换,n不替换,a替换所有,q放弃,l替换第一个并进入插入模式,^E^Y是提示你用Ctrl+eCtrl+y来滚动屏幕的。

上下文相关替换(正则替换)

正则替换,匹配字符串可以使用正则,懒得看就用这个:s/pattern/new/,其它参数和前文一致

更具体的来说(其实没什么用)
语法格式如下(:g(global全局)):
:g /pattern/s/old/new/g    将会把包含pattern的行中,把所有old替换为new
第一个g表示是在文件的所有行上执行的命令,模式pattern识别要发生替换的行。在那些包含模式pattern的行上,ex将把old替换(s)为new。最后的g表示在该行上进行全部替换。

如果用来进行搜索的模式与想要修改的模式相同,那么就不必重复它:
:g/string/s//new/g  等价于  :g/string/s/string/new/g
还要注意:
:g/string/s//new/g  也等价于 :% s/string/new/g
可以用第二种方式少输一些字符

参考

vim的全局替换

相关推荐

zycglboy / 0评论 2020-05-21