vim替换字符串(vim替换指定内容)

之前讨论过关于在vim中使用正则表达式的知识可以很方便的搜索到。现在,在前面讨论的基础上,我们将继续讨论如何执行替换操作。substitute 简介Substi

之前讨论过关于在vim中使用正则表达式的知识可以很方便的搜索到。现在,在前面讨论的基础上,我们将继续讨论如何执行替换操作。

substitute 简介

Substitute允许我们先找到一段文本,然后用新的替换它。它的使用很复杂,需要提供一个匹配的模式和一个替代字符串。命令格式如下:

:[range]s[substitute]/{ pattern }/{ string }/{ flag } range表示范围,与前面介绍的其他ex命令中的范围功能相同。模式表示匹配的模式。回想一下我之前说过的话。这里的图案的含义与之前介绍的普通图案和插入图案是不同的。它表示用于匹配和突出显示的一串字符串。String是用于替换的字符串,用一个项目替换所有匹配。Flag是一些替代标志,我们将在后面介绍。比如:%s/Python/Python/g表示在整个文件中用Python替换Python(这么长时间没提ex命令了,不知道各位朋友还记不记得%代表当前打开的文件)。g是标志位,表示整行的所有匹配都被修改,而不仅仅是第一个匹配。

标志位

在上面的例子中,我们使用G作为标志位,但是也有其他标志位。我们可以通过标志位灵活地定义替换的行为。以下是一些常用的标志位:

\r:插入一个换行符\t:插入一个制表符\\:插入一个反斜杠\1:插入第一个子匹配项\2:插入第二个子匹配项\0:插入匹配模式的所有内容&:与 \0用法相同~:使用上一次调用 substitute时提供的 string内容\={vim script}:执行 vim script并将返回内容作为 string

标志那么多,怎么记,平时怎么用?不要担心,下面的例子将展示如何使用它们。我们可以在日常使用中学习它们。

示例使用g替换所有内容

怎样才能把python学的很好,用的越来越多就好。Python非常强大,你可以在工作中学习Python。我们已经把上面文本中的所有Python都改成了vim。我们先来看看不使用标志是什么样子的。也就是说,在这里输入:%s/python/vim。

vim替换(vim替换参数)

我们发现它只是替换了每一行中python出现的第一个地方,同一行之后的python不受影响。在这里,我们使用/g来替换python的每个实例。

符号g很容易与单词global联系起来,它应该表示整个选定的文本范围。但是,我们已经选择了当前文件中的所有文本,这似乎是合理的。但是g的范围应该是整行,我们选取了文中所有的行。看似效果一样,但理解上确实有差距。为什么它作用于线条?我认为vim源于编辑器ed,vim的ex命令源于编辑器ed,编辑器ed是一个行编辑器,所以大部分命令作用于行。这应该说得通。

手动选择是否需要替换

有时候我们并不想盲目替换全部内容,而只是部分内容。例如,在上面的文本中,我们只想用vim替换第二行的最后一个python。那么可以使用c标志。你可以理解为复制?。Vim会问我们是否需要更换。也就是说,我们在这里输入:%s/python/vim/gc。稍后可以按Y确定替换,N表示不替换,切换到下一个匹配。所以我们可以在这里输入nny。

其实不止yn这两个选项,还有ynaql和< Ctrl+e & gt;和。它们的含义如下:

y:替换本处匹配n:不替换本处匹配a:替换此处之后的所有匹配项,随后退出本次替换q:退出本次匹配l:替换此处之后退出本次替换<Ctrl + e>:向上翻滚屏幕<Ctrl + y>:向下翻滚屏幕重用上次匹配模式

如果我们将{pattern}部分留给空,那么vim将重用最后一个{pattern}。让我们用一个例子来看看如何使用这个特性。

#定义版本& # 34;v1.01 & # 34#定义标题& # 34;维姆& # 34;#定义路径& # 34;~/.config/nvim & # 34;我们想把里面的字符串改成宽字符,就是在双引号前加L。首先,我们必须匹配所有的引号。很多时候,正则表达式很复杂,不可能一下子写对,所以这里我们采取步骤。首先,我们正确地编写正则表达式来匹配所有带双引号的字符串。\ v & # 34(.*)"你可以得到所有的字符串。

然后我们用上面的模式替换,即输入:%s//L[17]/gc。当然,这里只有三行代码一眼就知道我们要替换所有的东西,但是代码一增长,我们就需要确认是否需要替换。

【/br/】复杂的正则表达式我们不可能一次输入正确,在替换操作时因为正则表达式不正确,每次重新输入一堆内容会很麻烦。而且,如果使用substitute命令后才发现错误,就需要取消并重新输入这么大的字符串。与替换相比,搜索模式不会修改文本。我们可以使用;慢慢修改,直到满意为止。当模式正确时,可以通过{pattern} leave 空重用上一个模式。

注意,离开模式空会在历史命令中留下不完整的记录,模式和命令是独立存储的。在上面的例子中,如果我执行一个新的匹配,例如,我想找到所有的定义。后来,当我使用重新执行命令时,我发现匹配的内容发生了变化。一种方法是将最后一个模式存储在寄存器中,匹配时从寄存器中取数据填充{pattern}部分。

最后一次匹配成功后如何将对应的图案放入寄存器?这里我们引入一个新的内容命令窗口。命令窗口是显示历史命令的缓冲区,与普通缓冲区的区别仅在于显示历史命令。使用Q:可以呼出,这里我们可以使用q/呼出模式的命令窗口。用在相应的图案行& # 34;I $粘贴一行,然后使用< C-r & gt;我来填充{图案}。

用空有时候方便有时候麻烦。请根据具体情况自行判断如何使用以上两种方法。

使用寄存器的内容进行替换

{pattern}字段保留为空,vim将自动匹配先前的模式。所以如果我把替换字段留为空,会不会把最后一个字符串替换成这个?实验后发现,vim并没有这么做。它使用空字符串替换它(只需在最后一个替换字符串中使用~符号)。如果想快速填充替换字段,可以先复制,然后在替换中使用0寄存器。也就是说,我们可以输入:% s/{ pattern }/< C-r & gt;0/gc来完成替换。就像上面的例子一样。

但这种方法有一个缺点,就是如果复制的内容中有/&等特殊符号,会造成错误。这时,我们可以手动编辑寄存器的内容,对特殊符号进行转义。这时候我们就会想,有没有办法让vim知道我只想把寄存器里的特殊符号当成普通字符串。当然有办法,我们可以用vim脚本来实现这个需求。我们可以输入:%s/{pattern}/\=@0/gc,其中\=是我们之前列出的vim脚本的用法,后面的@0是vim脚本的内容,表示取0的寄存器的内容。

vim脚本的内容出现在这里,不过不用担心,这里涉及的都是最简单的vim脚本内容,更新完vim的基本内容后,会新开一个专栏介绍vim脚本和vim的配置。到时候,你可以回来看看这个方法。这个剧本也很好理解不是吗?

使用上一次的substitute命令

假设我们在执行替换命令时忘记在前面添加%,我们当然可以使用< Up & gt键在前一个的基础上修改它。

这里有一个在正常模式下输入g的更简单的方法&它会重新执行整个文件中最后一个替换命令。它相当于:%s//~/&。当其他部分正确时,您可以考虑使用此命令,但是您忘记添加%。

我们再来看另一种情况:
假设我有这样一段代码。

mini = { apply name:function(config){ return obj . factory(config,this . getname());}}我准备在这个基础上增加一个新的函数,让它变成这样。

mini = { apply name:function(config){ return obj . factory(config,this . getname());},applyNumber:function(config){ return obj . factory(config,this . get number());}}我们发现简单的复制前面的函数,然后把名字改成数字就够了。我们可以使用:%s/Name/Number/g来执行替换,但是有一个问题是它替换了所有东西。幸运的是,你可以用一次来撤销所有的修改。

我引入了命令模式。大多数ex命令可以使用选择模式的选定部分作为命令执行的范围,因此可以替换。让我们先选择以后要更改的零件,然后使用:& &在所选零件中重复最后一个替换命令。这两个&有不同的意思。第一个&表示重复最后一个替换命令,但不包含上次指定的标志位。在它后面添加另一个&表示最后一个标志位重复。下面的&与上面介绍的g &中的&含义相同。

使用子匹配进行替换

假设我有这样的联系记录。

Jack,12398988011 Pony Ma,16528649018 Donald Trump,15092838173 Joe Biden,18571820986现在我想改变顺序,这样电话号码排在前面,人名排在最后。
首先,构造一个能准确匹配人名和电话号码的正则表达式:(。*)、\s+(\d{11})。第一个括号匹配人名,第二个括号匹配电话号码的11位整数。

那么我们可以使用前面介绍的{pattern} leave 空来重新组织新的排列格式:%s//,

使用 vimscript 脚本

初步介绍了从寄存器中读取内容进行替换时使用vimscript的例子。下面是另一个使用vimscript的例子,但是不要慌,使用的脚本极其简单,理解起来没有障碍。

假设有这样一段HTML代码

& lth2 & gt这是一个h2标签& lt/H2 & gt;& lth3 & gt这是一个h3标签& lt/H3 & gt;& lth4 & gt这是一个h4标签& lt/H4 & gt;& lth5 & gt这是h5标签& lt/H5 & gt;我们想升级标题标签,换句话说,改变< h2 & gt,晋升为

首先,我们构建一个模式来匹配相应的数字。我们可以用\d来匹配数字,但是它会匹配所有的数字,所以我们加一个限制,只匹配<或者h <的/h开头的数字,这时正则表达式可以改成\ < \/?H\d,我们只想要下面的数字,所以我们可以裁剪这个匹配。\ < \/?h\zs\d .这样标签后面的数字都匹配了,但是内容里面的数字不匹配。

然后我们引入一个新的vimscript命令——sub match,它接收一个指示匹配数量的参数,并返回相应的匹配。我们可以用这个函数把每一个匹配得到-1,也就是输入:% s/\ = sub match(0)-1/g来完成这个操作。

最后的总结

在本文中,我将重点介绍命令substitute的使用,介绍该命令的相应标志位,并通过一些示例演示如何使用这些标志位。相信你对替换命令有一定的了解。

朋友们可能还会有疑问。目前推出的搜索替换好像只是针对某个文件的。想在项目中做全局替换,该怎么做?请想一想我们之前是如何在多个文件中执行宏的。这部分就不介绍了。这是一个练习。至于找多个文件,我们会在后面的部分继续介绍。

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。

作者:美站资讯,如若转载,请注明出处:https://www.meizw.com/n/296166.html

发表回复

登录后才能评论