我是 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])的行,并用括号括起来的匹配数字替换它。