2

我是 Vim 的初学者,我一直在阅读有关替换的内容,但我还没有找到这个问题的答案。

假设我在文件中有一些数字,如下所示:

    1
    2
    3

我想得到:

    (1)
    (2)
    (3)

我认为该命令应该类似于:s:\d\+:........ :s/foo/bar另外,和有什么区别:s:foo:bar

谢谢

4

3 回答 3

12

这是另一种稍微不那么冗长的解决方案:

:%s/^\d\+/(&)

解释:

^   anchors the pattern to the beginning of the line
\d  is the atom that covers 0123456789
\+  matches one or more of the preceding item
&   is a shorthand for \0, the whole match
于 2013-06-14T12:36:11.527 回答
8

让我反过来说。

:s/foo/bar第一:和之间没有区别:s:foo:bar;无论你在 之后使用什么分隔符s,vim 都希望你从那时起使用。例如,如果您有一个涉及大量斜线的替换,这可能会很好。

对于第一个:要对当前行的第一个数字执行此操作(假设没有逗号、小数位等),您可以这样做

:s:\(\d\+\):(\1)

\(...\)不会改变匹配的内容 - 相反,它告诉 vim 记住匹配的内容并存储它。第一个\(...\)存储在 中\1,第二个存储在 中\2,依此类推。因此,当您进行替换时,您可以参考\1以取回号码。

如果要更改当前行上的所有数字,请将其更改为

:s:\(\d\+\):(\1):g

如果要更改所有行上的所有数字,请将其更改为

:%s:\(\d\+\):(\1):g
于 2013-06-14T12:04:18.713 回答
1

你可以做你想做的事:

:%s/\([0-9]\)/(\1)/

%s表示全局搜索和替换,即对文件中的每一行进行搜索/替换。定义了一个组,该\( \)组又被 引用\1。所以上面的搜索和替换,找到所有有一个数字([0-9])的行,并用括号括起来的匹配数字替换它。

于 2013-06-14T12:05:23.870 回答