vim: replace sub-match with the same number of new strings -


my plan pretty standard search replace, replacing instances of old_string new_string. problem want arbitrary number of old_strings following specific prefix. example:

old_string = "a" new_string = "b" prefix = "xxxx"  xxxxaaaaaaaa => xxxxbbbbbbbb xxxxaaapostfix => xxxxbbbpostfix xxaaaa => xxaaaa 

etc. i'm not sure how this. imagine there's way s/xxxxa*/xxxxb{number of a's}/g or something, have no idea is.

you can this! use \= register evaluate vimscript. :h s/\=:

substitute expression           *sub-replace-expression*                         *sub-replace-\=* *s/\=* when substitute string starts "\=" remainder interpreted expression.  special meaning characters mentioned @ |sub-replace-special| not apply except "<cr>".  <nl> character used line break, can 1 double-quote string: "\n".  prepend backslash real <nl> character (which nul in file). 

then can use repeat , submatch functions build right string. example:

:%s/\(xxxx\)\(a\+\)/\=submatch(1).repeat('b', len(submatch(2))) 

i chose use \+ instead of * because pattern not found after substitute command finished (this effects hlsearch , n)

of course, if use \zs , \ze (start/end of match) atoms, can use less capturing groups, makes waaay shorter , clearer.

:%s/xxxx\zsa\+/\=repeat('b', len(submatch(0))) 

Comments

Popular posts from this blog

node.js - Node js - Trying to send POST request, but it is not loading javascript content -

javascript - Replicate keyboard event with html button -

javascript - Web audio api 5.1 surround example not working in firefox -