我有很多单词,看起来像这样:
foo,foo bar,bar@foo,foo# bar,bar$ foo#
现在我想把它变成:
"foo","foo bar","bar@foo","foo# bar","bar$ foo#"
因此,分隔符是逗号。
在vi(m)
中执行此操作的最佳方式是什么?
修改: 有人会关心详细说明这些事吗?
答案 0 :(得分:8)
这似乎有效。捕获所有不是逗号的内容,并将其替换为引号中捕获的部分。命令末尾的g
表示替换与该行上的正则表达式匹配的所有实例。没有g
它只会匹配第一个。请查看:h :s
和:h :s_flags
:%s/\([^,]\+\)/"\1"/g
输入:
foo,foo bar,bar@foo,foo# bar,bar$ foo#
输出:
"foo","foo bar","bar@foo","foo# bar","bar$ foo#"
答案 1 :(得分:1)
在vim中执行简单操作的最快方法是使用宏;它比学习如何定义函数或找出搜索和替换模式所需的时间更短。
在命令模式下,
将光标移动到行0
的开头
开始将宏录制为宏qa
插入引号i"
移至冒号或行尾/.,\|$
<Enter>
附加引号a"
移至下一个单元格ll
的开头
停止录制宏q
现在您已经转换了第一个单元格并记录了一个宏。要转换另一个单元格@a
(或@@
,这意味着运行上次使用的宏)。到达终点后,移至下一行的开头。
答案 2 :(得分:0)
尝试:
for l in range( 1, line('$') ) |
call append( line('.') - 1, join( map( split( getline('.'), ',' ), '"\"" . v:val . "\""' ), ',' ) ) |
delete |
endfor
<强>解释强>:
对于带逗号的每一行拆分行,使用map
函数添加一个前导和尾随双引号,用逗号连接它们并将其附加到当前行之上,然后删除当前行的光标,这将是旧的
答案 3 :(得分:0)
除了字符串的开头和结尾外,s/,/","/g
也可以。所以我想这一切都取决于你是否正在寻找快速而肮脏的黑客来完成一次工作,或者你是否希望这是一项你需要重复的工作。