66

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
  • 11,992
  • 4
  • 59
  • 69

3 Answers3

90

\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.

rush
  • 27,055
  • 7
  • 87
  • 112
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.

Starman
  • 155
  • 6
yagad
  • 21
  • 1
0

Better way to enable you to go over each match is to add a "c" to the end of the code, rather than go line-by-line

%s/print\( .*\)/logging.info\(\1\)/gc