简体   繁体   中英

vim search-replace question

I have a few trace lines in my file of the form

M_TRACE(EV_TRACE_LEVEL_DEBUG, "some trace");

I want to convert those into

M_TRACE(EV_TRACE_LEVEL_DEBUG, "%s: some trace", __FUNCTION__);

However I have already a few traces which display the function name also.

To make the conversion i am using the following command

:%g/M_TRACE/s/"\(.*\)"/"%s: \1", __FUNCTION__/c

which unfortunately includes a redundant FUNCTION in some places.

Is there any better way to do this?

You can do this in a single command:

:%g/M_TRACE/s/"\(.*\)"\(, __FUNCTION__\)\?/"%s: \1", __FUNCTION__/

It will replace the ", __FUNCTION__ " if its already present or it simply append it if its not present.

You could try:

   :%g/M_TRACE.*\");/s/"\(.*\)"/"%s: \1", __FUNCTION__/c

to exclude lines with an arg after the string.

2nd try: Use Vim's zero-width negative look-behind pattern:

%g/M_TRACE.*\(__FUNCTION__\)\@<!);/s/"\(.*\)"/"%s: \1", __FUNCTION__/

That's M_TRACE followed by a ); thats NOT preceded by __FUNCTION__

I would do it in two steps: first replace the part inside the quotes, then replace ") with ", __FUNCTION__)

However, if you just want to do it with just one command:

:%g/M_TRACE/s/"\(.*\)".*/"%s: \1", __FUNCTION__);  

If you have a few (dozen) you can just do an interactive search/replace using i nteractive mode:

:%g/M_TRACE/s/"\(.*\)"/"%s: \1", __FUNCTION__/igc

and just step through them. Answering y/n as you go.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM