说我有十行,我想在这些行中出现的某些单词前加上文字?它不一定是在行的开头。
自:
sdfsd foo sdfsd
sfsd foo fsdf
sdfsdf foo sdfsdf
为:
sdfsd bar(foo sdfsd
sfsd bar(foo fsdf
sdfsdf bar(foo sdfsdf
是否也可以不仅在bar(
前加foo
而在bar(foo)
实际上加上//
?
我还想快速将{{1}}条评论附加到多行(C风格的评论)。
我使用的是Vim / GVim 7.2。
答案 0 :(得分:168)
转到第一个foo
,按 Ctrl - v 进入视觉区块模式,然后按下直到foo
的所有行都为标记。然后按 Shift - i 插入(块的)开头。完成后按 Esc ,插入的字符将添加到标记块左侧的每一行。
要在最后插入,请再次按 Ctrl - v ,向上/向下移动以标记所有受影响的行,然后按结束或 $ 将选择范围扩展到行尾。现在你可以按 Shift - a 追加到所有行的末尾,就像之前的 Shift - i
视觉选择也可以使用正常的移动命令完成。因此,要在C中注释整个块,您可以移动到左括号并键入 Ctrl - v % Shift - i / / Esc 。
答案 1 :(得分:44)
要回答您的第一个问题,请参阅下面的
:%s/foo/bar(&)/g
将查找foo
,并使用bar()
包围匹配的模式。 /g
将在一行中多次执行此操作。
由于您只是匹配foo
,因此您可以执行简单的:s/foo/bar(foo)/g
。但是,如果您决定匹配正则表达式而不是简单的单词(例如f[a-z][a-z]
),则上述操作将起作用。 '&'在上面代表你所匹配的内容。
答案 2 :(得分:16)
要为一组行添加前缀,我使用两种不同的方法之一:
一种方法是块选择(由sth提及)。通常,您可以使用 ctrl-V 选择一个矩形区域,然后选择光标移动。一旦你突出显示一个矩形,按 shift-I 将在矩形的左侧插入字符,或者 shift-A 将它们附加在矩形的右侧。长方形。因此,您可以使用此技术创建一个矩形,其中包含要添加前缀的行的最左侧列,单击 shift-I ,键入前缀,然后单击“转义”。
另一种方法是使用替换(如Brian Agnew所述)。 Brian的替换将影响整个文件(命令中的%表示“所有行”)。为了影响几行,最简单的方法是在第一行/最后一行上点击 shift-V (启用可视线模式),然后移动到最后一行。然后输入:
:s/^/YOUR PREFIX/
^是一个正则表达式(在这种情况下,是行的开头)。通过在可视线模式下输入此内容,您会看到'<,'>在s之前自动插入。这意味着替换的范围将是视觉选择。
额外提示:如果您的前缀包含斜杠,您可以使用反斜杠转义它们,也可以使用不同的标点字符作为命令中的分隔符。例如,要添加C ++行注释,我通常会写:
:s:^:// :
对于添加后缀,替换方法通常更容易,除非您的所有行都具有完全相同的长度。只需使用$代替^而你的字符串将被追加而不是预先填充。
如果要同时添加前缀和后缀,可以执行以下操作:
:s/.*/PREFIX & SUFFIX/
。*匹配整行。 &在替换中放回匹配的文本(整行),但现在它将添加你的前缀和后缀。
BTW:在评论代码时,您可能希望稍后取消注释。你可以使用visual-block( ctrl-V )来选择斜线,然后点击d删除它们,或者你可以使用替换(可能使用 shift进行视觉线选择) -V )删除这样的前导斜杠:
:s:// ::
答案 3 :(得分:6)
:正常救援!
:%norm Wibar(
:%norm WEa)
:norm(al)重放命令,就好像你输入了它们一样:
W - 转到下一个单词
i - 开始插入模式
bar( - 键入序列'bar('
或者在一行中:
:%norm Wibar(
CTRL v ESCEa)
如果您正在运行Windows,请输入 ctrl q 而不是 ctrl v 。
答案 4 :(得分:3)
另一种可能性(在您的测试用例中可能不那么有用,但在其他情况下很方便)是用标记封锁您想要更改的区域。
:'a,'b s/foo/bar(&)/
如果屏幕上的所有内容都可见,我通常喜欢视觉模式,如果开始和停止被多个屏幕分开,我通常更喜欢标记。
答案 5 :(得分:1)
另一个简单的正则表达式是:
%s/^/<text you want to prepend>/
答案 6 :(得分:0)
对于C风格的评论,请使用Brian的正则表达式答案,并在结尾$
上匹配,然后插入。