39

:%s/one/two/将替换第一次出现的onewith two。有没有一种简单的方法可以代替最后一次出现?

我不能假设它在行尾旁边,并且在最后一次出现“抓取”时没有什么独特之处,类似于:

one two three one two three one two one two one two ...
4

3 回答 3

53

最简单的方法是在匹配前允许任意文本,并使用以下命令指定匹配区域\zs

:%s/.*\zsone/two/
于 2012-08-08T13:49:27.790 回答
13

因为 .* 是贪婪的,所以这应该有效:

:%s/\(.*\)one/\1two/
于 2012-08-08T13:49:06.603 回答
3

如果你想替换一行中的一个单词,你也可以说:

$?one<CR>cetwo<ESC>

它将转到行尾 ( $) 并向后找到单词one( ?one<CR>)。然后它将更改( c) 所有内容,直到带有字符串的单词的结尾( ) 。当然,您可以使用、等来改变。您甚至可以说更改接下来的 17 个字符。etwoeEfFc17l

于 2012-08-08T13:54:29.877 回答