20

我相信这很容易,我只是缺少一两个字符。

我需要在文件中搜索特定术语,当我找到它时,我需要在该行中附加一些内容。我想在比赛的每一行都这样做。

要做一次,我可以这样做:

/Thing to find/s/$/ Stuff to append/

简单的。如果我的“要找的东西”位于行尾,我可以这样做:

%s/\(Thing to find\)$/\1 Stuff to append/

在每个匹配的行上做同样的事情

但是我如何在每一行做第一件事呢?

我想我能做到

%s/\(Thing to find.*\)$/\1 Stuff to append/

但这感觉很笨拙,如果要查找的东西不止一次在同一行上,它会变得更加复杂。

我认为必须有一种方法可以在任何地方进行我的第一次搜索,但是我无法编写足够简洁的描述来搜索它。

如此强大的 Stackers,有人想用一个两字节的解决方案来打我一巴掌吗?

4

3 回答 3

42

:g//命令就是您要查找的内容 - 它在与模式匹配的每一行上运行一个命令:

:g/Thing to find/ s/$/ Stuff to append/
于 2013-01-08T14:10:40.680 回答
3

如前所述,:g//这是您所追求的,但是满足您特定需求的另一个效率是运行普通命令作为全局命令的一部分。s只是可以执行的一堆命令之一:g//。你也可以d(elete), j(oin), 和几乎任何你能想象到的 ex 命令。

另一个有用的是norm(al),它可以用来执行任何正常的命令。从:helpon 开始:norm(al):“命令就像输入一样执行。”

因此,您还可以通过以下方式实现您想要的:

:g/Thing to find/norm Astuff to append

假设我正在为我的测试环境复制我的 mysql 配置文件。我想将 _test 附加到以“database=”开头的每一行,所以:

g/^database=/norm A_test

需要记住的是,Vim 将执行 'norm' 之后的所有内容,就好像你输入了它一样。所以A命令和要附加的文本之间没有空格(或者你会在输出中得到一个额外的空格)。

于 2019-11-17T23:18:03.317 回答
1

:%s/green/bright &/g:将文件中的每个“绿色”替换为“亮绿色”。

&: 替代品matched string。你可以做任何你能想象到的事情。

您可以使用标志\v,这样我们就不必使用尽可能多的转义字符。

在or--no-startup-id之后附加参数execexec_always

:%s/exec\(_always\)\?/& --no-startup-id/g

简化它:

:%s/\vexec(_always)?/& --no-startup-id/g

于 2020-08-23T15:39:34.690 回答