如何在vim的列表中添加引号beetwen单词?

时间:2018-06-01 14:49:26

标签: vim vi

我有以下列表:

[torunn,sentry,moonstone,avispa,phil coulson]

是否可以使用Vim将其更改为:?

["torunn","sentry","moonstone","avispa","phil coulson"]

3 个答案:

答案 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,我们需要空格。

我使用转义括号将其放在字符组中。

此外,由于我们接下来可以使用逗号或结束括号,因此我创建了另一个字符组,并允许使用交替运算符的任一字符:

\(,\|\]\)

在此检查我们的模式匹配:
enter image description here

然后在替换字符串中引用这些字符组(并包括引号)。

将它们全部拉到一起,这是替换命令:

:s/\([ a-zA-Z]\+\)\(,\|\]\)/"\1"\2/g

之前:

enter image description here

之后:

enter image description here

减少过度设计的解决方案

正如@bimlas指出的那样,设计较少的解决方案如下:

:s/[^,]\+/"\0"/g

\0只是对整个匹配模式的引用(请参阅:help \0)。