文章目录
  1. 1. 基本操作
  2. 2. 查找范围
  3. 3. 特殊字符
  4. 4. 使用当前的word或是寄存器
  5. 5. 示例

基本操作

%s/foo/bar/g

在所有行中寻找‘foo’,并且用‘bar’替换

:s/foo/bar/g

在当前行寻找‘foo’,并且用‘foo’替换

:%s/foo/bar/gc

将每一个‘foo’,并用’bar‘替换,但是替换时询问

%s/\<foo\>/bar/gc

查找单词完全匹配’foo‘替换成bar,但是替换时询问

:%s/foo/bar/gci

查找’foo‘并且替换成’bar’但是大小写不敏感,替换时询问,

:%s/foo\c/bar/gc是与上一个相同,因为\c是大小写不敏感的

使用:set noingorecase查找时就是大小写敏感的

:%s/foo/bar/gcI

将每一个’foo‘替换成’bar‘,大小写敏感,替换时询问

:%s/foo\C/bar/gc与上一条相同

使用:set ignorecase查找时不是大小写敏感的

g表示global(全局的) - 每一行出现的都被改变,不仅是每一行的第一个

这样做的假设是默认’gdefault‘ 和 ’edcompatible‘ 是关的,所以需要:%s///g使用全局替换

使用:set gdefault时,:%s///是使用全局替换,而:%s///g不是

使用g选项主要是相反的意思

使用c选项时,对每个替换操作需要确认。Vim可能会输出replace with foobar (y/n/a/q/l/^E/^Y)?, 这里foobar是:%s/…/…,你可以使用y进行替换,n跳过这个替换,a对当前及以后所有进行替换操作(a是 all remaining matches),q是退出这个操作,l是对当前进行替换操作,然后退出操作,(l是last),^E是指按下Ctrl + E滚到上一屏,^Y是指Ctrl + Y滚到下一屏,然而最后两个选项是可选的。

还在使用c标志,Vim会跳到它从顶部查找到的第一个匹配项,提示你确认对匹配执行替换。Vim IncSearch突出匹配的文本给你一个视觉提示在对哪个匹配进行操作。

查找范围

:s/foo/bar

将当前行’foo‘全部替换为‘bar’

:%s/foo/bar/g

将所有行的’foo‘全部替换为’bar‘

:5,12s/foo/bar/g

将5-12行(包括5行和12行)中的’foo’全部替换为‘bar’

:’a,’bs/foo/bar/g

从标记a到标记b所有行中的‘foo’替换为‘bar’

:’<,’>s/foo/bar/g 当使用 +visual时,在visual选中的区域。Vim会自动加入 ( ‘<, ‘>)当你选中一片区域,并且按下:时。

:.,$s/foo/bar/g

从当前行(.)到最后一行($)将’foo‘替换成’bar‘

:.,+2s/foo/bar/g

从当前行(.)到下两行将’foo‘替换成’bar‘

:g/^baz/s/foo/bar/g

以’baz‘开头的所有行中的’foo‘替换成’bar’

注意:在vim7.3中,应用到标记或是在visual模式下的选择(使用标记 ‘< and ‘>)的查找和替换范围,不包括列的位置,默认应用到每一行,除非使用\%V标记,如:‘<,’>s/\%Vfoo/bar/g.

特殊字符

使用查找时:

., *, \, [, ^, 和 $ 是元字符

+, ?, |, &, {, (, and ) 必须不用特殊函数

\/ 是 /(用反斜杠 + 斜杠查找斜杠)

\t 是tab,\s是空格

\n 是新的一行,\r是CR(回车符 = Ctrl + M = ^M)

[]在中括号之间的内容表示要查找内容的一个集合,字符的范围可以用一个 -,比如,要查找一个字符a,b,c, 或者是数字1,可以使用[1a-c]表示,\^表示取反,例如[^1a-c]表示匹配除1, a,b,c以外的所有字符
{ # }表示重复,比如/foo.\{2\} 会匹配foo和紧跟着的两个字符,\没有必要,/foo.{2}会有相同的结果

\(foo\) 对‘foo’制造了一个回溯引用,括号没有\表示匹配,所以\在这里是必须的

使用替换时:

\r表示新的一行,\n表示没有字符

\&代表搜索的匹配模式

\0插入匹配到的整个文本

\1插入第一个回溯引用,\2表示插入第二个回溯引用

也可以使用其他的分割符来进行查找,例如使用#

:s#http: //www.example.com/index.html#http: //example.com/#

使用\zs和\ze来指定替换的开始和结束,比如

:s/Copyright 2007 All Rights Reserved/Copyright 2008 All Rights Reserved/

可以用

:s/Copyright \zs2007\ze All Rights Reserved/2008/

使用当前的word或是寄存器

:%s//bar/g

用‘bar’替换上一个匹配的模式

:%s/foo/ <c-r> <c-w>/g

用光标下的单词替换foo
<c-r><c-w> 是指当按下 Ctrl-R 和 Ctrl-W. 光标下的单词会输入到你准备替换的地方

:%s/foo/<c-r><c-a>/g
将每一个 ‘foo’替换为光标下的单词(用空格作为分界)
<c-r><c-a> 是指按下 Ctrl-R 和 Ctrl-A.

:%s/foo/<c-r>a/g

将每一个 ‘foo’替换为寄存器’a’中的内容
Replace each occurrence of ‘foo’ with the contents of register ‘a’.
<c-r>是指按下 Ctrl-R 和 a.
寄存器’a’中的内容会输入的替换的位置

:%s/foo/<c-r>0/g

和上面的含义相同,使用寄存器 0 中的内容作为替换文本

:%s/foo/\=@a/g

将每一个 ‘foo’替换为寄存器’a’中的内容
\=@a 寄存器 ‘a’的引用
寄存器’a’中的内容不会在命令行中显示,对多行文本很有用

:%s/<c-r>*/bar/g

将在系统剪贴板( * 寄存器)中内容的内容替换成bar

:%s/<c-r>a/bar/g

将在文本中出现的寄存器’a’中的内容替换为’bar’
寄存器中的换行被表示成 ^M

示例

:%s/foo/bar/

将每一行第一次出现的‘foo’用‘bar’替换

:%s/.*\zsfoo/bar/

将每一行最后一次出现的’foo’用‘bar’替换

%s/ \<foo\>/bar/gc

对每一行,删除所有出现的‘foo’
:%s/\<foo\>.*//

将每一行出现的‘foo’以及这一行之后的所有文本删除

:%s/\<foo\>.\{5\}//

将每一行出现的‘foo’以及之后的5个字符删除

:%s/\<foo\>\zs.*//

将每一行出现在‘foo’之后的文本删除

:%s/.*\<foo\>//

将每一行中的‘foo’和它之前的文本删除

:%s/.*\ze\<foo\>//

将每一行出现在‘foo’之前的文本删除

:%s/.* \(\<foo\>\).*/\1/

将每一行‘foo’之前的文本和之后的文本删除

:s/^\(\w\)/\u\1/

将当前行的第一个字符改成大写

:%s/\(.*\n\)\{5\}/&\r/

每5行插入一个空白行

将(.*\n)(任意一行)重复5次({5})

替换成&(匹配到的文本,就是5行内容),后面加上新的一行(\r)

更好的学习资料

文章目录
  1. 1. 基本操作
  2. 2. 查找范围
  3. 3. 特殊字符
  4. 4. 使用当前的word或是寄存器
  5. 5. 示例