Thursday, December 8, 2016

Re: discrepancy in regular expression match using bufdo command

Hi,

sinbad schrieb am 08.12.2016 um 08:57:
>
> I have a file contents as follows, i want to change the text from abc("def"); to
> foo(("def")); in multiple files.
>
> It works if i run the command, but the same thing fails if i run the same command using bufdo;
>
> works-> :s/abc(\(.*\));/foo((\1));/gc

I assume you wanted to change the text in the whole file; thus you need
do provide the range 1,$ or % for the substitute command. Otherwise you
will only change the text on the one line where you cursor currently
happens to be.

> fails-> :bufdo execute "s/abc(\(.*\));/foo((\1));/"
>
> error: E486: Pattern not found: abc((.*));

This command fails because you enclosed the command in double quotes.
Inside double quotes the backslash has a special meaning.

You can fix this by either doubling every backslash which effectively
uses the backslash to escape itself:

:bufdo execute "%s/abc(\\(.*\\));/foo((\\1));/"

Or you can use single quotes where the backslash has no special meaning:

:bufdo execute '%s/abc(\(.*\));/foo((\1));/'

Or get rid of the execute command and use the substitute command directly:

:bufdo %s/abc(\(.*\));/foo((\1));/

I'd prefer the last solution.

Regards,
Jürgen

--
Sometimes I think the surest sign that intelligent life exists elsewhere
in the universe is that none of it has tried to contact us. (Calvin)

--
--
You received this message from the "vim_use" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php

---
You received this message because you are subscribed to the Google Groups "vim_use" group.
To unsubscribe from this group and stop receiving emails from it, send an email to vim_use+unsubscribe@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

No comments: