Could I ask a follow-up question along these lines?

I've never used \=, but I see it only works at the beginning of the substitute 
string and makes the entire replacement an expression. Is there a way to put it 
in the middle.

For example, I was thinking if the CSV file had other numbers, and only one 
field should be 0 padded, ex:

Blah, 745, blah, 98, blah
Blah, 34, blah, 200, blah

And only the 4th field should be zero padded, you'd want something like this:

%s/\(\([^,]\+,\s*\)\{4\}\)\(\d\{1,6\}/\1\=someExprWith\2/g

That's an eyesore, maybe not the best regex, but it'd work if you could put the 
expr in the middle of the replace string. Is this doable?

*tim*

-----Original Message-----
From: A.J.Mechelynck [mailto:[EMAIL PROTECTED] 
Sent: Wednesday, May 09, 2007 4:15 AM
To: Luke Vanderfluit
Cc: vim@vim.org
Subject: Re: replace number with zero-packed number

Luke Vanderfluit wrote:
> Hi. I have a csv file that contains a field with a number, say 98.
> I need to zerofill the fields to be 6 digits.
> So any field that is say 98, should become 000098.
> 
> Is there an easy way to do this with search and replace?
> 
> Thanks.
> Kind regards.
> 

There are several ways to do it, depending in part on what exactly you want to 
do. I haven't tested the following but I think they will work:

- To fill in only the number under the cursor: no search-replace needed, place 
the Insert-mode cursor just before it and type in four zeros.

- To replace the number 98 (only) wherever it appears as a word (thus 98 but 
not 498 or 987 or 89 or 0098):

        :%s/\<98\>/000098/g

- To replace the number 98 wherever it appears between non-digits (thus also 
k98g or \x98 which the above wouldn't replace, but still not 0098 or x098):

        :%s/\%(^\|[^[:digit:]]\)98\_[^[:digit:]]/000098/g

- To fill-in all numbers to at least 6 digits:

        :%s/\<\d\{1,5}/=("00000" . submatch(0))[-6:]/g

- To fill or truncate all numbers to exactly 6 digits (losing the millions if 
there are any):

        :%s/\<\d\+\>/=("00000" . submatch(0))[-6:]/g

All this, assuming that existing numbers have no thousands separators and that 
you don't want to add any.

See
        :help :s
        :help /\<
        :help /\>
        :help /\d
        :help /multi
        :help [:digit:]
        :help sub-replace-expression
        :help submatch()
        :help expr-[:]
etc.


Best regards,
Tony.
--
Fortune's Real-Life Courtroom Quote #29:

THE JUDGE: Now, as we begin, I must ask you to banish all present
           information and prejudice from your minds, if you have
           any ...

Reply via email to