前往小程序,Get更优阅读体验!
立即前往
发布
社区首页 >专栏 >在vim和vi中查找和替换字符串

在vim和vi中查找和替换字符串

作者头像
入门笔记
发布2022-06-02 18:03:57
发布2022-06-02 18:03:57
16.5K00
代码可运行
举报
文章被收录于专栏:入门小站入门小站
运行总次数:0
代码可运行

Vim是最受欢迎的命令行文本编辑器。它预装在macOS和大多数Linux发行版上。在Vim中查找和替换文本非常容易。

基本查找和替换

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

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

替换命令的一般形式如下:

代码语言:javascript
代码运行次数:0
复制
:[range]s/{pattern}/{string}/[flags] [count]

该命令在[range]中的每一行中搜索{pattern},并将其替换为{string}。是与命令[count]相乘的正整数。

如果未给出[range][count],则仅替换当前行中找到的pattern。当前行是光标所在的行。

例如,要在当前行中搜索字符串 foo的第一个匹配项,并将其替换为 bar,则可以使用:

代码语言:javascript
代码运行次数:0
复制
:s/foo/bar/

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

代码语言:javascript
代码运行次数:0
复制
:s/foo/bar/g

如果要搜索并替换整个文件中的所有匹配的模式,请使用百分比字符%作为range。此字符表示从文件的第一行到最后一行的范围:

代码语言:javascript
代码运行次数:0
复制
:%s/foo/bar/g

如果省略{string}部分,则将其视为空字符串,并删除匹配的模式。以下命令删除当前行中字符串 foo的所有匹配:

代码语言:javascript
代码运行次数:0
复制
:s/foo//g

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

代码语言:javascript
代码运行次数:0
复制
:s/foo/bar/gc

要确认每次替换,请使用c标志:

:s/foo/bar/gc

代码语言:javascript
代码运行次数:0
复制
replace with bar (y/n/a/q/l/^E/^Y)?

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

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

代码语言:javascript
代码运行次数:0
复制
:%s/^foo.*/Vim is the best/gc

^(脱字符)符号与行的开头匹配,.*与任意数目的任何字符匹配。

区分大小写

默认情况下,搜索操作区分大小写;搜索 FOO将不匹配 Foo。

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

代码语言:javascript
代码运行次数:0
复制
:s/Foo/bar/gi

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

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

代码语言:javascript
代码运行次数:0
复制
:s/foo/bar/gi

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

搜索范围

未指定范围时,替代命令仅在当前行中运行。

范围可以是一行或两行之间的范围。行说明符用,;字符分隔。可以使用绝对行号或特殊符号来指定范围。

例如,要将从第3行到第10行的所有行中所有出现的 foo替换为 bar,你可以使用:

代码语言:javascript
代码运行次数:0
复制
:3,10s/foo/bar/g

该范围包括所有内容,这意味着该范围包括第一行和最后一行。

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

代码语言:javascript
代码运行次数:0
复制
:.,$s/foo/bar/

还可使用 +或-符号来设置行说明符,其后是从前一个行号中添加或减去的数字。如果省略符号后的数字,则默认为1。

例如,要从当前行和接下来的四行开始,用 bar替换每个 foo,请输入:

代码语言:javascript
代码运行次数:0
复制
:.,+4s/foo/bar/g

替换整个单词

替代命令将模式查找为字符串,而不是整个单词。例如,如果你正在搜索 gnu,则搜索结果匹配 gnu嵌入较大词(例如 cygnus或 magnum)中的内容。

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

例如,要搜索 foo一词,你可以使用\<foo>

代码语言:javascript
代码运行次数:0
复制
:s/\<foo\>/bar/

替代历史

Vim跟踪你在当前会话中运行的所有命令。要浏览历史记录以查找先前的替代命令,请输入:s,然后使用向上/向下箭头键查找先前的替代操作。要运行命令,只需按Enter。你也可以在执行操作之前编辑命令。

范例

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

代码语言:javascript
代码运行次数:0
复制
:5,20s/^#//

取消注释的第5行到第20行,恢复之前的更改:

代码语言:javascript
代码运行次数:0
复制
:5,20s/^#//

将苹果,橙色和芒果的所有实例替换为水果:

代码语言:javascript
代码运行次数:0
复制
:%s/apple\|orange\|mango/fruit/g

删除每行末尾的尾随空格:

代码语言:javascript
代码运行次数:0
复制
:%s/\s\+$//e
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-12-24,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 入门小站 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 基本查找和替换
  • 区分大小写
  • 搜索范围
  • 替换整个单词
  • 替代历史
  • 范例
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档