开发者

Replace all characters in a regex match with the same character in Vim

I have a regex to replace a certain pattern with a certain string, where the string is built dynamically by repeating a certain character as many times as there are characters in the match.

For example, say I have the following substitution command:

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

However, I would like to do something like this instead:

%s/hello/-{5}/g

where the non-existing notation -{5开发者_开发百科} would stand for the dash character repeated five times.

Is there a way to do this?

Ultimately, I'd like to achieve something like this:

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

which would replace any instance of a string of only hellos with the string consisting of the dash character repeated the number of times equal to the length of the matched string.


%s/\v(hello)*/\=repeat('-',strlen(submatch(0)))/g


As an alternative to using the :substitute command (the usage of which is already covered in @Peter’s answer), I can suggest automating the editing commands for performing the replacement by means of a self-referring macro.

A straightforward way of overwriting occurrences of the search pattern with a certain character by hand would the following sequence of Normal-mode commands.

  1. Search for the start of the next occurrence.

    /\(hello\)\+
    
  2. Select matching text till the end.

    v//e
    
  3. Replace selected text.

    r-
    
  4. Repeat from step 1.

Thus, to automate this routine, one can run the command

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

and execute the contents of that s register starting from the beginning of the buffer (or anther appropriate location) by

gg@s
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜