Vim регулярное выражение заменить на n символов - PullRequest
13 голосов
/ 07 сентября 2011

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

Например, скажем, у меня есть это регулярное выражение:

%s/hello/-----/g

Однако я хотел бы сделать что-то подобное вместо этого:

%s/hello/-{5}/g

, что означает заменить привет на 5 штрихов.

Есть ли способ сделать это?

В конечном счете, я хотел бы сделать что-то вроде этого:

%s/(hello)*/-{\=strlen(\0)}/g

, который заменит любой экземпляр строкитолько hello s с тире, длина которых равна длине совпадающей строки.

Ответы [ 2 ]

24 голосов
/ 07 сентября 2011
%s/\v(hello)*/\=repeat('-',strlen(submatch(0)))/g
6 голосов
/ 08 сентября 2011

Вместо использования команды замены можно автоматизировать команды редактирования для выполняя замену. Самый простой способ переписать вхождения шаблон поиска с конкретным символом от руки выглядит следующим образом.

  1. Поиск начала следующего вхождения.

    /\(hello\)\+
    
  2. Выберите соответствующий текст до конца.

    v//e
    
  3. Заменить выделенный текст.

    r-
    
  4. Повторите с шага 1.

Итак, чтобы автоматизировать эту процедуру, запустите команду

:let[@/,@s]=['\(hello\)\+',"//\rv//e\rr-@s"]

и выполнить содержимое этого s регистра, начиная с начала буфер (или из другого подходящего места):

gg@s
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...