7

我正在寻找一种方法来替换除最后一个以外的所有点。

例子:

Blah - whatever - foo.bar.baz.avi应该成为
Blah - whatever - foo bar bar.avi

由于我将在文件中有不止一行,并且每一行中的点数各不相同,我正在寻找一个通用的解决方案,而不是像“替换第一个 X 匹配项”这样的东西,其中 X 是一个常数。

4

3 回答 3

11

这似乎可以解决问题:

%s/\.\(.*\.\)\@=/ /g

\@=前瞻。如果有任何后续句号,它仅匹配句号。

:help zero-width

于 2012-06-03T13:05:48.357 回答
6

作为第一个答案的变体,您可能更喜欢这种语法:

%s/\.\ze.*\./ /g

它让您断言在搜索运算符之后有一个句号。

于 2012-06-03T15:59:27.563 回答
0

另一种可能对学习有用的方法(替换内部视觉选择)是:使用,输入 where 。
:g/^/normal $F.hv0:s/\%V\./ /g^M
^MCTRL-VEnter

这意味着:对于每一行 ( g/^/) 类型$F.(转到最后一个点),从字符向左视觉选择直到行首 (hv0​​ ),然后:s/\./ /g^M仅在视觉选择 ( ) 内替换点 ( \%V)。

于 2012-06-06T08:16:37.260 回答