在Vim/Vi中查找和替换
这篇文章描述了如何在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
可以跳过匹配,按q
或Esc
可以退出替换。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的一个强大的功能,它可以让你快速地对文本进行修改。
如果你有任何问题,请随时留言评论。