Replace using VIM, reuse part of the search pattern
Solution 1
\0
is the whole match. To use only part of it you need to set it like this and use \1
.s/(\([0-9]*\))/{\1}/
More detailed instruction you can find here or in vim help.
Solution 2
I recently inherited some legacy code and I wanted to replace all occurrences like:
print "xx"
print x,y
print 'xx'
to
logging.info("xy")
or
logging.info(x,y)
Building on the previous answer and in hopes that someone will benefit from it I used the following command, that will change all occurrences:
%s/print\( .*\)/logging.info\(\1\)/g
If you substitute %
with .
and remove /g
you will end up
with
.s/print\( .*\)/logging.info\(\1\)
that will enable you to go over each match and choose whether you change it or not.
Related videos on Youtube
Bernhard
Updated on September 18, 2022Comments
-
Bernhard over 1 year
I am working with
VIm
and trying to set up a search and replace command to do some replacements where I can re-use the regular expression that is part of my search string.A simple example would be a line where I want to replace
(10)
to{10}
, where 10 can be any number.I came this far
.s/([0-9]*)/what here??/
which matches exactly the part that I want.
Now the replacement, I tried
.s/([0-9]*)/{\0}/
But, this gives as output
{(10)}
Then, I tried
.s/(\zs[0-9]*\ze)/{\0}/
However, that gave me
({10})
, which I also close, but not what I want.I think I need some other kind of marking/back-referencing instead of this
\0
, but I don't know where to look. So the question is, can this be done in vim, and if so, how? -
Bernhard almost 6 yearsThis really doesn't answer the original question in any way
-
Randall almost 5 yearsNote the parentheses for the capture are backslash-escaped.
-
Chris over 2 yearsWould be a good comment. Regardless, it's presence is appreciated.