vim-替换

替换

1
2
3
4
5
6
:[range]substitute/from/to/[flags]

#range指定范围
#substitute可以简写为s
#用to替换from
#flag指定行范围和操作

flag

1.对一行中的第一个出现的进行替换:

1
:s/a/b

2.对一行中出现的所有a进行替换:

需要使用到g(global)这个参数,有这个参数的话表示对一行的操作

1
2
#使用flag:g
:s/a/b/g

3.对文中的所有a进行替换操作:

需要使用到%,它表示的是此文件名

1
:%s/a/b/g

4.查看文中有多少个a

一般来说我们在替换一个东西之前都需要看一下它出现了多少次

1
2
#使用flag:n
:%s/a/b/gn #它并不会执行替换操作,仅仅打印出现次数

5.每次替换之前都让我们确认一次

这样可以选择那些不进行替换

1
2
3
4
5
6
7
8
9
#使用到了flag:c
:%s/a/b/gc

#这里面出现的几个参数
y 替换
n 跳过这个
a 剩下的全部替换
q 结束替换,剩下的不进行替换,之前的保留
l 与q的区别在于当前这个替换之后在结束替换

6.打印最后修改的行

感觉这个作用不是很大

1
2
#使用到了flag:p
:%s/a/b/gp

from

from支持正则表达式

1
2
eg:
:%s/^the/these/g #将所有行首是the的替换为these

如果替换中出现了/这个字符,需要转义

1
:%s/\/home/\/root/g		#将所有/home开头的替换为/root

当然了,其实不需要写这么复杂,有+替代/,这和perl有点像啊

1
:%s+/home+/root+g

range

1.没有range,只对当前行操作

1
:s/a/b/g

2.指定全文的范围

1
:%s/a/b/g

3.某行到某行之间

1
2
# m到n行,闭区间[m,n]
:m,ns/a/b/g

4.当前行到最后一行

1
2
#当前行使用点,这个点不能少
:.,$/a/b/g

5.支持相对定位

那么这个参考位置就是光标所在的当前行.

1
2
3
:-5,.s/a/b/g	#前五行到当前行的所有a替换为b
:-5,+4s/a/b/g #前五行到后四行行的所有a替换为b
:.,+4s/a/b/g #当前行到后四行的所有a替换为b

6.还可以通过搜索模式来指定作用范围

这种也类似与第五种,只是这里没有明确的行数,需要它自己去找。在vim中查找使用的就是(向文章前查找,/向文章后查找),?与/总是成对出现

1
2
#这里就是寻找当前行之前以the开头的,以及当前行之后以this开头的范围间的haha并替换为hehe
:?^the?,/^this/s+haha+hehe+g

7.混搭5与6中的搜索定位功能

1
2
#这样加上数字之后表示不替换匹配到的行本身
:?^the?+1,/^this/-1s+haha+hehe+g

8.还可以通过visual模式去指定要操作的行

1
2
#shift+v选择好范围后,使用冒号,范围则已经指定好了
:'<,'>s/g/b/g

这里是使用到了标记来指定范围,所以,以后我们同样可以使用自己的标记来指定范围。有点秀啊这个

9.第五点是手动输入开始结束位置,这个更厉害

当然默认是以当前行为一个开始范围,好像没有向文章开头的快捷做法,因为-已近被占用了

1
2
#当前行之后的五行
5: #输入这个以后,范围已近指定好了

全局命令:global

前面的替换都是通过指定范围(数字或者匹配),然后在进行替换这些操作

但是global不仅做到了这些,它默认是作用域全文,首先通过匹配到某些行,然后对这些行进行操作。相比于之前的多了一个定位。针对的不是范围操作,而是找到指定行。

1
:[range]global/{pattern}/{command}
1
2
3
4
5
eg:
#将所有以//开头的中所有foobar替换为barfoo
:g+^//+s/foobar/barfoo/g
#将所有以if开头的,中所有的[替换为<
:g/^if/+s+\[+\<+g #特殊符号需要转义