我确信这很容易,我只是错过了一两个角色。
我需要在文件中搜索特定术语,当我找到它时,我需要在该行中添加一些内容。而且我想在比赛的每一行都这样做。
要做一次,我可以这样做:
/Thing to find/s/$/ Stuff to append/
易。如果我的“找到的东西”在行的末尾,我可以这样做:
%s/\(Thing to find\)$/\1 Stuff to append/
在每个匹配的行上做同样的事情
但我如何在每一行上做第一件事?
我想我能做到
%s/\(Thing to find.*\)$/\1 Stuff to append/
但是如果找到的东西不止一次就会变得笨拙而且会让它变得更加复杂。
我认为必须有一种方法可以在任何地方进行我的第一次搜索,但是我在编写简洁的描述以进行谷歌搜索时遇到了麻烦。
如此强大的Stackers,任何人都想让书呆子用两个字节的解决方案给我打电话?
答案 0 :(得分:31)
:g//
命令是您正在寻找的 - 它在与模式匹配的每一行上运行命令:
:g/Thing to find/ s/$/ Stuff to append/
答案 1 :(得分:1)
如前所述,:g//
是您所追求的,但是满足您的特殊需要的另一项效率是将常规命令作为全局命令的一部分运行。 s
只是:g//
可以执行的一系列命令之一。您还可以d(elete)
,j(oin)
,以及几乎可以想象到的所有命令。
另一个有用的是norm(al)
,可用于执行任何常规命令。从:help
的{{1}}开始:“执行命令就像键入命令一样。”
因此,您还可以通过以下方式实现所需的目标:
:norm(al)
比方说,我正在为测试环境复制mysql配置文件。我想将_test附加到以“ database =“开头的每一行,所以:
:g/Thing to find/norm Astuff to append
要记住的是,Vim将在'norm'之后执行所有操作,就像您键入它一样。因此g/^database=/norm A_test
命令和要附加的文本之间没有空格(否则您将获得一个额外的空间)在输出中)。
答案 2 :(得分:1)
:%s/green/bright &/g
:用文件中的“亮绿色”替换每个“绿色”。
&
:替代matched string
。您可以做任何想像的事。
您可以使用标志\v
,因此我们不必使用太多转义字符。
在--no-startup-id
或exec
之后添加参数exec_always
:%s/exec\(_always\)\?/& --no-startup-id/g
简化它:
:%s/\vexec(_always)?/& --no-startup-id/g