kee*_*lar 1 regex vim replace list cassandra
我想转换所有逗号分隔的字符串"",如下所示:
"hello,world,stack,overflow"
Run Code Online (Sandbox Code Playgroud)
使用VIM 进入以下Cassandra列表格式:
"['hello','world','stack','overflow']"
Run Code Online (Sandbox Code Playgroud)
每个元素都被包含在其中'',整个原始字符串被包含在其中"[]".我能知道如何在VIM中完成这项工作吗?
在我的输入中,引用的逗号分隔字符串""是csv格式化行的一部分.以下是一个例子:
other,fields,123,456,"hello,world,stack,overflow"
second,row,567,890,"another,comma,separated,string"
...
Run Code Online (Sandbox Code Playgroud)
我想将其转换为:
other,fields,123,456,"['hello','world','stack','overflow']"
second,row,567,890,"['another','comma','separated','string']"
...
Run Code Online (Sandbox Code Playgroud)
并且我的每个目标字符串都不会跨越多行.
试试这个
:%s/\v(".*)@<=\s*([^,"]+)\s*(.*")@=/'\2'/g
:%s/"/"[
:%s/"\[\@!/]"
Run Code Online (Sandbox Code Playgroud)
或者一下子
:%s/\v(".*)@<=\s*([^,"]+)\s*(.*")@=/'\2'/ge | %s/"/"[/e | %s/"\[\@!/]"
Run Code Online (Sandbox Code Playgroud)
这适用于该示例.如果该行上有多对引号,则无效.
说明
:%s/\v(".*)@<=\s*([^,"]+)\s*(.*")@=/'\2'/g
Run Code Online (Sandbox Code Playgroud)
这将查找一个字符串,该字符串在其前后有一个引用,具有前瞻和后观.然后我们捕获所有不是逗号或引号的内容,并用单引号中的捕获部分替换它.这会抛出任何前导或尾随空格.
:%s/"/"[
Run Code Online (Sandbox Code Playgroud)
如果您:s之前使用过,这应该是自我解释的
:%s/"\[\@!/]"
Run Code Online (Sandbox Code Playgroud)
这使用负前瞻来查找第一个引号,后面没有左括号,并用右括号和引号替换它.
在考虑了这个之后,我认为你可以一次性完成整个文件,无论天气如何都有一对以上的报价.
第一个函数只是一个辅助函数,它使得替换命令更容易输入.(你可以在一行中完成三个替换命令,但这样做会很难看).它与上面的内容完全相同.
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
Run Code Online (Sandbox Code Playgroud)
第二个函数查找所有引用的字符串并将其传递给函数,并立即替换它.你知道哪一个是开头和结尾的引号,因为保证只有一对引号.
其工作原理以及正则表达式解析器不会混淆的原因是模式匹配在第一次匹配结束后开始.所以,如果你有字符串" A " B " C "
" A "将是第一个匹配," C "并将是第二个匹配,因为当解析器尝试匹配后,它会看到B " C ",但不匹配.
要在你的vim中运行它,只需将两个函数复制到你的vimrc中.在要运行的文件中,运行以下命令.
:call RunCommaReplace()
Run Code Online (Sandbox Code Playgroud)