我是 Vim 的初学者,我一直在阅读有关替换的内容,但我还没有找到这个问题的答案。
假设我在文件中有一些数字,如下所示:
1
2
3
我想得到:
(1)
(2)
(3)
我认为该命令应该类似于:s:\d\+:.......
. :s/foo/bar
另外,和有什么区别:s:foo:bar
?
谢谢
我是 Vim 的初学者,我一直在阅读有关替换的内容,但我还没有找到这个问题的答案。
假设我在文件中有一些数字,如下所示:
1
2
3
我想得到:
(1)
(2)
(3)
我认为该命令应该类似于:s:\d\+:.......
. :s/foo/bar
另外,和有什么区别:s:foo:bar
?
谢谢
这是另一种稍微不那么冗长的解决方案:
:%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
让我反过来说。
:s/foo/bar
第一:和之间没有区别:s:foo:bar
;无论你在 之后使用什么分隔符s
,vim 都希望你从那时起使用。例如,如果您有一个涉及大量斜线的替换,这可能会很好。
对于第一个:要对当前行的第一个数字执行此操作(假设没有逗号、小数位等),您可以这样做
:s:\(\d\+\):(\1)
\(...\)
不会改变匹配的内容 - 相反,它告诉 vim 记住匹配的内容并存储它。第一个\(...\)
存储在 中\1
,第二个存储在 中\2
,依此类推。因此,当您进行替换时,您可以参考\1
以取回号码。
如果要更改当前行上的所有数字,请将其更改为
:s:\(\d\+\):(\1):g
如果要更改所有行上的所有数字,请将其更改为
:%s:\(\d\+\):(\1):g
你可以做你想做的事:
:%s/\([0-9]\)/(\1)/
%s
表示全局搜索和替换,即对文件中的每一行进行搜索/替换。定义了一个组,该\( \)
组又被 引用\1
。所以上面的搜索和替换,找到所有有一个数字([0-9]
)的行,并用括号括起来的匹配数字替换它。