Replace using VIM, reuse part of the search pattern

78,247

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.

Share:
78,247

Related videos on Youtube

Bernhard
Author by

Bernhard

Updated on September 18, 2022

Comments

  • Bernhard
    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
    Bernhard almost 6 years
    This really doesn't answer the original question in any way
  • Randall
    Randall almost 5 years
    Note the parentheses for the capture are backslash-escaped.
  • Chris
    Chris over 2 years
    Would be a good comment. Regardless, it's presence is appreciated.