regex - Find and replace comma-separated strings to Cassandra list format in VIM -


i convert comma-separated string quoted "" such following:

"hello,world,stack,overflow" 

into following cassandra list format using vim:

"['hello','world','stack','overflow']" 

where each element embraced '' , whole original string embraced "[]". can know how should in vim?

in input, such comma-separated string quoted "" part of csv formatted row. below example:

other,fields,123,456,"hello,world,stack,overflow" second,row,567,890,"another,comma,separated,string" ... 

and transform into:

other,fields,123,456,"['hello','world','stack','overflow']" second,row,567,890,"['another','comma','separated','string']" ... 

and each of target strings won't across multiple lines.

try this

:%s/\v(".*)@<=\s*([^,"]+)\s*(.*")@=/'\2'/g :%s/"/"[ :%s/"\[\@!/]" 

or @ once

:%s/\v(".*)@<=\s*([^,"]+)\s*(.*")@=/'\2'/ge | %s/"/"[/e | %s/"\[\@!/]" 

this works on example. not work if there more 1 pair of quotes on line.

explanation

:%s/\v(".*)@<=\s*([^,"]+)\s*(.*")@=/'\2'/g 

this looks string has quote before , after lookaheads , lookbehinds. capture isn't comma or quote , replace captured part in single quotes. throws out leading or trailing spaces.

:%s/"/"[ 

this should self explanatory if have used :s before

:%s/"\[\@!/]" 

this uses negative lookahead find first quote isn't followed left bracket , replaces right bracket , quote.


after thinking bit more think can whole file in 1 shot regardless of weather there more 1 pair of quotes on line.

the first function helper function makes substitute command little easier type. (you have done 3 substitute commands in single line have been ugly). same thing stuff above.

function! replacecommaseperated(string)     let l:tmp = substitute(a:string, '[^,"]\+', "'\\0'", 'g')     let l:tmp = substitute(l:tmp, '"', '"[', '')     return substitute(l:tmp, '"\[\@!', ']"', '') endfunction  function! runcommareplace()     %s/".\{-}"/\=replacecommaseperated(submatch(0))/g  endfunction 

the second function finds quoted strings , passes off function , gets replaced @ once. , know 1 beginning , end quotes because there guaranteed 1 pair of quotes.

the reason works , regex parser doesn't confused pattern matching starts after end of first match. if had string " " b " c "
" " first match , " c " second match because when parser tried match after b see b " c " , doesn't match.

to run in vim copy 2 function vimrc. , in file want run run following command.

:call runcommareplace() 

Comments

Popular posts from this blog

css - Which browser returns the correct result for getBoundingClientRect of an SVG element? -

gcc - Calling fftR4() in c from assembly -

.htaccess - Matching full URL in RewriteCond -