Vim: заменить все точки, кроме последней в строке

Я ищу способ, чтобы заменить все точки в строке, кроме последней.

пример:

Blah - whatever - foo.bar.baz.avi должны стать
Blah - whatever - foo bar bar.avi

поскольку у меня будет более одной строки в файле, а количество точек варьируется в каждой строке, я ищу общее решение, а не что-то вроде "заменить первые совпадения X" на X, являющееся константой.

3 ответов


Это, кажется, сделать трюк:

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

\@= это lookahead. Он соответствует только полной остановке, если есть какие-либо следующие полные остановки.

посмотреть :help zero-width.


в качестве варианта первого ответа вы можете предпочесть следующий синтаксис:

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

Это позволит вам поставить утверждение, что после оператора поиска будет следующая полная остановка.


другим способом, который может быть полезен для изучения (замена внутри визуального выбора), было бы:
:g/^/normal $F.hv0:s/\%V\./ /g^M
где ^M вводится с CTRL-V, Enter.

это означает: для каждой строки (g/^/) типа $F.(перейти к последней точке), визуально выберите от символа влево до начала строки (hv0), а затем замените точками (:s/\./ /g^M) только внутри визуального выбора (\%V).