我是Vim的初学者,我一直在阅读有关替代的内容,但我没有找到这个问题的答案。
假设我在文件中有一些数字:
1
2
3
我想得到:
(1)
(2)
(3)
我认为命令应该类似于:s:\d\+:.......
。另外,:s/foo/bar
和:s:foo:bar
之间有什么区别?
由于
答案 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]
)的行,并用括号括起来的匹配数字替换它。