在多行中用`(number)`替换`number`

时间:2013-06-14 11:48:34

标签: vim

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

假设我在文件中有一些数字:

    1
    2
    3

我想得到:

    (1)
    (2)
    (3)

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

由于

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:8)

让我反过来解决这些问题。

首先::s/foo/bar:s:foo:bar之间没有区别;无论你在s之后使用哪个分隔符,vim都会期望你从那时开始使用。例如,如果你有一个涉及大量斜杠的替换,这可能会很好。

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

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

\(...\)不会改变匹配的内容 - 相反,它告诉vim记住内部匹配的内容,然后存储它。第一个\(...\)存储在\1中,第二个存储在\2中,等等。因此,当您进行替换时,可以引用\1来获取数字。< / p>

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

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

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

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

答案 2 :(得分:1)

你可以做你想做的事:

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

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