On 3/29/07, Dudley Fox <[EMAIL PROTECTED]> wrote:
On 3/29/07, Tim Chase <[EMAIL PROTECTED]> wrote:
> > I have used vim for a while, and though no expert I am fairly
> > comfortable with the common commands. Recently I ran into a situation
> > where I just couldn't find a way to do a search and replace. I was
> > hoping some of you experts could help me out.
> >
> > Starting text:
> > nameTable[pattern with spaces0] = ("pattern with spaces0", 12345)
> > nameTable[pattern with spaces1] = ("pattern with spaces1", 67890)
> > nameTable[pattern with spaces2] = ("pattern with spaces2", 243)
> > nameTable[pattern with spaces3] = ("pattern with spaces3", 421)
> > nameTable[pattern with spaces4] = ("pattern with spaces4", 3455)
> > nameTable[pattern with spaces5] = ("pattern with spaces5", 2222)
> >
> > Desired Text:
> > nameTable[patternwithspaces0] = ("pattern with spaces0", 12345)
> > nameTable[patternwithspaces1] = ("pattern with spaces1", 67890)
> > nameTable[patternwithspaces2] = ("pattern with spaces2", 243)
> > nameTable[patternwithspaces3] = ("pattern with spaces3", 421)
> > nameTable[patternwithspaces4] = ("pattern with spaces4", 3455)
> > nameTable[patternwithspaces5] = ("pattern with spaces5", 2222)
> >
> >
> > Notice that the only difference is that the spaces are removed from
> > the pattern in between the square brackets. I think I want to use \zs
> > and \ze, but I couldn't wrap my head around the syntax. Any help would
> > be appreciated.
>
> There are a number of ways to do this depending on the complexity
> of your document.  For the case you describe, this could easily
> just be done with
>
> :%s/pattern with spaces/patternwithspaces
>
> By omitting the "g" flag, it replaces only the first instance on
> the line.
>
> If, however, "pattern with spacesN" each represents a different
> pattern, things get a little more complex.

They are indeed different patterns.

>Something like the following might do the trick:
>
> :%s/nameTable\[\zs[^]]*/\=substitute(submatch(0), '\s', '', 'g')
>
> This, as you suggested, uses the \zs tag.  However, it also uses
> the incredibly-useful "\=" for expression evaluation which you
> can read more about at
>
>         :help sub-replace-special
>
> You could tighten that search pattern if you needed, so that it
> became
>
>   /nameTable\[\zs[^]]*\ze] = ("...

I think this is what I am looking for. Thanks for pointing out the
sub-replace-special. I didn't know that existed.

> Or if you needed to make it really tight, you could do something
> like (broken into multiple lines for clarity, but should be all
> one line with no spaces in the joining)
>
> :%s/
> \(nameTable\[\)
> \([^]]\+\)
> \(] = ("\1", \d\+)\)
> /\=
> submatch(1).
> substitute(submatch(2), '\s', '', 'g').
> submatch(3)
>
> This will only match lines where the pattern with spaces appears
> in both places...the one you want to replace, and the 2nd half
> that you don't want to change.

Fortunately I don't need it that strict.

>
> All sorts of crazy stuff.  That last one is the tightest to what
> you describe, but you might be able to get away with one of the
> lazier options above. :)

I am all about lazy. Thanks for your help. Tonight when I get the
chance I will try my new found vim knowledge. This will make life much
easier for me.


Well I couldn't really wait until I got home, so I tried it here at
work. This is the expression which worked for me in case anyone else
want to do a similar search.
:%s/\[.\{-}\]/\=substitute(submatch(0),'\s','','g')/c

Thanks again.

Enjoy,
Dudley


>
> -tim

Thanks to everyone else who responded as well.

Enjoy,
Dudley

Reply via email to