0%

VIM基础学习(第六节:搜索命令和替换命令)转自:鱼C论坛

搜索命令

你知道文件中必定有你想要的东西,你也知道它的名字,但你却不知道它在哪里?在茫茫字符的海洋中,怎么办?

img

查找呗,VIM 的查找是从按下斜杠(/)那一刻开始的……

在普通模式下按下斜杠(/)也是进入命令行模式,此时该字符和光标均出现在屏幕的底部,这跟冒号(:)一样。

紧挨着斜杠(/)的是搜索目标,比如 /love,说明你找的是 love 这个字符串在光标后边第一次出现的位置,当然你也可以输入中文,比如 /你瞅啥

img

那如果要找下一个目标怎么办?这时你只需按 n 键即可定位到下一个符合的目标(向下查找),而按 N 键则返回上一个(向上查找)。

注意:第一个搜索到的目标不是文件中的第一个目标,而是从你的光标所在处开始找到的那个目标。所以你如果想要搜索文件中第一个匹配的目标,你应该先 gg 将光标移动到文件头,然后再使用搜索命令。

在普通模式下按下问号(?)也是进入命令行模式,实现的也是搜索功能。不过这回它是反过来的,你可以认为它是斜杠(/)功能的“反面派”。

前边我们说过 /FishC 是从光标位置向后开始搜索 FishC 这个字符串,而 ?FishC 则相反,是从光标位置向前开始搜索。

怕你头晕,给你列个表:

img

/目标 ?目标
搜索方向 从光标位置向后 从光标位置向前
n 向后搜索下一个 向前搜索下一个
N 向前搜索下一个 向后搜索下一个

当搜索到了文件的末尾(/目标)或开头(?目标),页面下方面会显示“Search hit BOTTOM, continuing at TOP”或“Search hit TOP, continuing at BOTTOM”的字样。表示一轮搜索到文件尾/头了,搜索下一个就是从文件头/尾开始咯。

img

我发现你发现了,VIM 会自动高亮所有匹配的目标,即使在你找到目标之后,它们仍然高傲的亮着!

img

img

很烦人对吧?告诉你怎么取消,输入冒号(:)进入命令行模式,然后输入 nohl 即可。

最后提个醒:在搜索命令中,.、*、[、]、^、%、/、?、~ 和 $ 这 10 个字符有着特殊意义,所以在使用这些字符的时候要在前面加上一个反斜杠(\),比如你要搜索问号,则输入 /?

替换命令

搜索在很多情况下都是为了替换,这句话小甲鱼没说错吧?

通过搜索功能,我们将光标定位到目标位置,如果你确定这个目标是可恶的,需要被替换的,你可以输入 : s/old/new,这样即可将光标所在行的第一个 old 替换为 new;你如果输入的是 : s/old/new/g,则表示将光标所在行的所有 old 替换为 new。

但如果要替换整个文件的所有匹配字符串怎么办?总不能每一行来一下吧?
只要你能想到的,VIM 就有办法!输入 : %s/old/new/g表示替换整个文件中每个匹配的字符串。

噢,你没有太大的把握,希望 VIM 在每次替换前都咨询一下你:“亲,我准备替换 XX 了,你确定要将 XX 替换成 OO 吗?”
可以,输入 :%s/old/new/gc

img

看到页面下方的 (y/n/a/q/l/^E/^Y) 了吗?这是 VIM 在咨询您的意见呢!

  • y 表示替换
  • n 表示不替换
  • a 表示替换所有
  • q 表示放弃替换
  • l 表示替换第一个并进入插入模式
  • ^E 表示用 Ctrl+e 来滚动屏幕
  • ^Y 表示用 Ctrl+y 来滚动屏幕

好吧,你可能会问“如果我只想替换第 5 行到第 13 行之间的所有 XX,可以吗?”

当然可以啦,使用 :5,13s/old/new/g 即可胜任你的要求:

img

我想你已经猜到了:5 表示开始替换的行号,13 表示结束替换的行号。

注释:VIM 的搜素和操作远没有这么简单,还有很多秘籍没有放出来,不过今天说的内容,已经足够你用了吧……更多秘籍将在进阶技巧中仔细讨论!

img