3

我有一长串的话,看起来像这样:

foo,foo bar,bar@foo,foo# bar,bar$ foo#

现在我想把它变成:

"foo","foo bar","bar@foo","foo# bar","bar$ foo#"

因此,分隔符是逗号。最好的方法是什么vi(m)

编辑:有人愿意详细说明反对意见吗?

4

4 回答 4

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#"
于 2013-06-10T17:30:00.737 回答
1

在 vim 中做简单事情的最快方法是使用宏;它比学习如何定义函数或找出搜索和替换模式花费的时间更短。

在命令模式下,
将光标移到行0
首 开始将宏录制为宏 aqa
插入引号i"
移到冒号或行尾/.,\|$ <Enter>
附加引号a"
移到下一个单元格的开头ll
停止录制宏q

现在您已经转换了第一个单元格并录制了一个宏。转换另一个单元格@a(或者@@这意味着运行最后使用的宏)。到达一行的末尾后,移动到下一行的开头。

于 2013-06-10T17:41:20.057 回答
0

Try:

for l in range( 1, line('$') ) | 
  call append( line('.') - 1, join( map( split( getline('.'), ',' ), '"\"" . v:val . "\""' ), ',' ) ) | 
  delete | 
endfor

Explanation:

For each line split line with comma, add a leading and trailing double quote using map function, join them with comma and append it above current line, and then delete current cursor line, that will be the old one.

于 2013-06-10T17:09:15.020 回答
0

除了字符串的开头和结尾,s/,/","/g就可以了。所以我想这一切都取决于你是否正在寻找一个快速而肮脏的黑客来完成一次工作,或者你是否希望这是一项你需要重复很多次的工作。

于 2013-06-11T14:13:30.467 回答