我有以下列表:
[torunn,sentry,moonstone,avispa,phil coulson]
是否可以使用Vim将其更改为:?
["torunn","sentry","moonstone","avispa","phil coulson"]
答案 0 :(得分:2)
在vim-surround和宏的帮助下,很容易:
我假设你的光标位于第一个字母(在这种情况下为“t”):qqys/\v,|]<cr>"nlq99@q
让我们一步一步地分解它:
qqys/\v,|]<cr>"nlq99@q
qq q # record a macro in the q register
ys # surround something with something
/\v,|]<cr> # search for comma or closing bracket
" # surround until there with double-quotes
n # jump to the next match
l # go one to the right
99@q # run the macro 99 times (will stop at first failure)
搜索查询\v,|]
只是打开v
ery魔术模式,然后匹配逗号或(|
)右括号。我们不需要逃避支架,因为我们没有打开支架。
答案 1 :(得分:2)
您可以使用替换:
s/\v(\w|\s)+/"&"/g
这将匹配单词+
或空格\w
字符的一个或多个(\s
)次出现。替换字符串"&"
是由引号括起的匹配模式&
。 &
:help s/\&
字符
答案 2 :(得分:1)
替代Ex命令是操纵CSV行的不错工具
我经常使用替代Ex命令操纵CSV。
在这种情况下,我只是通过字符范围匹配集合中的值:
[ a-zA-Z]
- &GT;类似于\w
,但您的集合没有_0-9
,我们需要空格。
我使用转义括号将其放在字符组中。
此外,由于我们接下来可以使用逗号或结束括号,因此我创建了另一个字符组,并允许使用交替运算符的任一字符:
\(,\|\]\)
然后在替换字符串中引用这些字符组(并包括引号)。
将它们全部拉到一起,这是替换命令:
:s/\([ a-zA-Z]\+\)\(,\|\]\)/"\1"\2/g
之前:
之后:
减少过度设计的解决方案
正如@bimlas指出的那样,设计较少的解决方案如下:
:s/[^,]\+/"\0"/g
\0
只是对整个匹配模式的引用(请参阅:help \0
)。