在Vim/Vi中查找和替换

评论 0 浏览 0 2021-01-11

这篇文章描述了如何在Vim / Vi中查找和替换文本。

Vim是最流行的命令行文本编辑器。它预装在macOS和大多数Linux发行版上。在Vim中查找和替换文本是快速而简单的。

基本的查找和替换

在Vim中,你可以使用:substitute(:s)命令来查找和替换文本。

要在Vim中运行命令,你必须处于正常模式,这是启动编辑器时的默认模式。要从任何其他模式回到正常模式,只需按下 "Esc "键。

替代命令的一般形式如下:。

:[range]s/{pattern}/{string}/[flags] [count]

该命令在[range]中搜索每一行的{pattern},然后用{string}替换它。[count]是一个正整数,与命令相乘。

如果没有给出[range][count],则只替换当前行中发现的模式。当前行是指光标所处的行。

例如,要搜索当前行中第一次出现的字符串 "foo",并将其替换为 "bar",你可以使用。

:s/foo/bar/

要想替换当前行中所有出现的搜索模式,请添加g标志。

:s/foo/bar/g

如果你想在整个文件中搜索和替换该模式,请使用百分比字符%作为范围。这个字符表示从文件的第一行到最后一行的范围。

:%s/foo/bar/g

如果省略了{string}部分,就会被认为是一个空字符串,并删除匹配的模式。下面的命令删除了当前行中字符串 "foo "的所有实例。

:s/foo//g

你可以使用任何其他非字母数字的单字节字符来代替斜线字符(/),除了作为分隔符。当你在搜索模式或替换字符串中有'/'字符时,这个选项很有用。

:s|foo|bar|

要确认每一个替换,请使用c标志。

:s/foo/bar/gc

输出

replace with bar (y/n/a/q/l/^E/^Y)?

y替换匹配,或按l替换匹配并退出。按n可以跳过匹配,按qEsc可以退出替换。a选项可以替换该匹配和该匹配的所有剩余出现。要向下滚动屏幕,请使用CTRL+Y,要向上滚动,请使用CTRL+E

你也可以使用常规表达式作为搜索模式。下面的命令将所有以'foo'开头的行替换为'Vim is the best'。

输出

:%s/^foo.*/Vim is the best/gc

^(圆点)符号匹配一行的开头,.*匹配任何数量的任何字符。

区分大小写

默认情况下,搜索操作是区分大小写的;搜索 "FOO "不会与 "Foo "相匹配。

要想忽略搜索模式的大小写,请使用i标志。

:s/Foo/bar/gi

另一种强制忽略大小写的方法是在搜索模式后加上\c。例如,/Linux\c执行忽略大小写搜索。

如果你改变了默认的大小写设置,并且你想进行区分大小写的搜索,请使用I标志。

:s/foo/bar/gi

模式后的大写字母\C也会强制进行大小写匹配搜索。

检索范围

当没有指定范围时,替代命令只在当前行中操作。

该范围可以是一行,也可以是两行之间的范围。行指定符用,;字符分开。范围可以用绝对的行数或特殊符号来指定。

例如,如果要将第3行至第10行所有出现的 "foo "替换为 "bar",你可以使用。

:3,10s/foo/bar/g

这个范围是包容性的,这意味着第一行和最后一行都包括在这个范围内。

.字符表示当前行,$-美元符号表示最后一行。要在从当前行到最后一行的所有行中替换 "foo"。

:.,$s/foo/bar/

也可以用'+'或'-'符号来设置行数,后面是一个数字,与前面的行数相加或减去。如果符号后面的数字被省略,它默认为1。

例如,要用'bar'替代每个'foo',从当前行和接下来的四行开始,请键入。

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

替换整个单词

替代命令将模式作为一个字符串来寻找,而不是整个单词。例如,如果你在搜索 "gnu",搜索找到的是 "gnu "被嵌入到更大的词中的匹配,如 "cygnus "或 "magnum"。

要搜索整个单词,输入\<来标记单词的开头,输入搜索模式,输入\>来标记单词的结尾。

例如,如果要搜索 "foo "这个词,你可以使用\<foo\>

:s/\<foo\>/bar/

替代历史

Vim会记录下你在当前会话中运行的所有命令。要浏览历史上以前的替代命令,请输入:s,并使用向上/向下的方向键来寻找以前的替代操作。要运行该命令,只需按下Enter。你还可以在执行操作前编辑命令。

实例分析

注释行(在行前添加#),从5到20。

:5,20s/^/#/

取消对第5至第20行的注释,恢复之前的修改。

:5,20s/^#//

将所有 "apple"、"orange "和 "mango "的实例替换为 "fruit"。

:%s/apple\|orange\|mango/fruit/g

移除每行末尾的尾部空格。

:%s/\s\+$//e

总结

搜索和替换是Vim的一个强大的功能,它可以让你快速地对文本进行修改。

如果你有任何问题,请随时留言评论。

最后更新2023-03-25
0 个评论
标签