2012-06-03 2 views
7

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

Пример:

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

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

+0

Да, я хочу заменить все точки пробелами, кроме одного между именем файла и расширением. – ThiefMaster

ответ

11

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

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

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

См. :help zero-width.

+0

О, мой, синтаксис vim для lookaheads и т. Д. Уродлив. Интересно, почему они не использовали синтаксис PCRE и т. Д. Use – ThiefMaster

+0

@ThiefMaster: Да ... Я был очень смущен тем, что шаблон должен предшествовать «оператору» взгляда ... но тем не менее, они очень удобны :) –

+1

@ThiefMaster попробуйте ': perldo s/searchme/replaceme/g' Perl5 regexen? Также: http://vim.wikia.com/wiki/Perl_compatible_regular_expressions – sehe

6

Как вариант первого ответа вы можете предпочесть этот синтаксис:

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

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

0

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

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

Смежные вопросы