91

假设我有十行,我想在这些行中出现的某个单词前面加上文本?它不必位于行首。

从:

sdfsd   foo sdfsd
sfsd    foo fsdf
sdfsdf  foo  sdfsdf

到:

sdfsd   bar(foo sdfsd
sfsd    bar(foo fsdf
sdfsdf  bar(foo  sdfsdf

是否也可以不仅在前面加上bar(实际包围foobar(foo)

我还想要一种将//注释附加到多行的快速方法(C 样式注释)。

我使用 Vim/GVim 7.2。

4

7 回答 7

170

转到第一个foo,按Ctrl-v进入可视块模式并按下直到foo标记所有行。然后按Shift-i在(块的)开头插入。完成后按Esc,插入的字符将添加到标记块左侧的每一行。

要在末尾插入,请再次按Ctrl- v,向上/向下移动以标记所有受影响的行,然后按End$将选择范围扩展到行尾。现在您可以按Shift-a在所有行的末尾追加,就像之前使用Shift-一样i

视觉选择也可以通过正常的移动命令来完成。因此,要在 C 中注释整个块,您可以移至左大括号并键入Ctrl- v % Shift- i // Esc

于 2009-07-23T20:39:43.040 回答
44

为了回答你的第一个问题,下面

:%s/foo/bar(&)/g

将寻找foo,并用 包围匹配的模式bar()。将/g在一行中多次执行此操作。

因为你只是匹配foo,你可以做一个简单的:s/foo/bar(foo)/g. 但是,如果您决定匹配正则表达式而不是简单的单词(例如f[a-z][a-z]),上述方法将起作用。上面的“&”代表你匹配的内容。

于 2009-07-23T20:31:49.187 回答
18

为了给一组行添加前缀,我使用两种不同的方法之一:

一种方法是块选择(由某物提到)。通常,您可以选择一个矩形区域,ctrl-V然后移动光标。突出显示一个矩形后,按下shift-I将在矩形的左侧插入字符,或者shift-A将它们附加到矩形的右侧。因此,您可以使用此技术制作一个矩形,其中包含要添加前缀的行的最左侧列,点击shift-I,键入前缀,然后点击转义。

另一种方法是使用替换(如 Brian Agnew 所述)。Brian 的替换将影响整个文件(命令中的 % 表示“所有行”)。要只影响几行,最简单的方法是shift-V在第一行/最后一行点击(启用可视行模式),然后移动到最后/第一行。然后输入:

:s/^/YOUR PREFIX/

^ 是一个正则表达式(在本例中为行首)。通过在可视行模式下键入此内容,您将看到 '<,'> 自动插入到 s 之前。这意味着替换的范围将是视觉选择。

额外提示:如果您的前缀包含斜杠,您可以使用反斜杠对其进行转义,或者您可以使用不同的标点符号作为命令中的分隔符。例如,要添加 C++ 行注释,我通常会这样写:

:s:^:// :

对于添加后缀,替换方法通常更容易,除非所有行的长度完全相同。只需将 $ 用于模式而不是 ^ ,您的字符串将被附加而不是预先附加。

如果要同时添加前缀和后缀,可以执行以下操作:

:s/.*/PREFIX & SUFFIX/

.* 匹配整行。替换中的 & 将匹配的文本(整行)放回原处,但现在它将添加您的前缀和后缀。

顺便说一句:注释掉代码时,您可能希望稍后取消注释。您可以使用 visual-block ( ctrl-V) 选择斜线,然后按 d 删除它们,或者您可以使用替换(可能使用视线选择,使用shift-V)来删除前导斜线,如下所示:

:s:// ::
于 2009-07-23T21:12:41.367 回答
6

: 正常救援!

:%norm Wibar(

:%norm WEa)

:norm(al) 重播命令,就像您输入了它们一样:

W - 转到下一个单词

i - 开始插入模式

bar( - 输入序列 'bar('

或者在一行中:

:%norm Wibar(ctrlvESCEa)

如果您正在运行 Windows,请键入ctrlq而不是ctrlv.

于 2011-03-10T03:47:08.350 回答
3

另一种可能性(可能在您的测试用例中不太有用,但在其他情况下很方便)是用标记封锁您想要更改的区域。

  • 将光标放在顶行的任意位置,然后按'a
  • 将光标放在最后一行的任意位置,然后按'b
  • 发出命令:'a,'b s/foo/bar(&)/

如果一切都在屏幕上可见,我通常喜欢视觉块模式,如果开始和停止被许多屏幕分开,我通常更喜欢标记。

于 2009-07-27T01:05:00.960 回答
1

另一个简单的正则表达式是:

%s/^/<text you want to prepend>/
于 2016-01-02T07:25:34.163 回答
0

对于 C 风格的注释,请使用 Brian 的正则表达式答案,并匹配 line ending $,然后插入。

于 2009-07-23T20:35:41.643 回答