如何在 vim 列表中的单词之间添加引号?
How to add quotes beetwen words in a list in vim?
我有以下列表:
[torunn,sentry,moonstone,avispa,phil coulson]
是否可以使用 Vim 将其更改为此?:
["torunn","sentry","moonstone","avispa","phil coulson"]
借助 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 魔法模式,然后匹配逗号或 (|
) 右括号。我们不需要转义括号,因为我们没有打开一个。
Substitute Ex 命令是处理 CSV 行的好工具
我经常使用替代 Ex 命令来处理 CSV。
在这种情况下,我只是通过字符范围匹配您的集合中的值:
[ a-zA-Z]
->类似于\w
,但是你的集合没有_0-9
,我们需要空格。
我使用转义括号将它放在一个字符组中。
此外,由于接下来可以有逗号或结束括号,我创建了另一个字符组并使用交替运算符允许任一字符:
\(,\|\]\)
在此处检查我们的模式匹配:
然后在替换字符串中引用这些字符组(并包括引号)。
综合起来,这里是替换命令:
:s/\([ a-zA-Z]\+\)\(,\|\]\)/""/g
之前:
之后:
减少过度设计的解决方案
正如@bimlas 所指出的,一个不那么过度设计的解决方案如下:
:s/[^,]\+/"[=15=]"/g
[=16=]
只是对整个匹配模式的引用(参见 :help [=17=]
)。
您可以使用替换:
s/\v(\w|\s)+/"&"/g
这将匹配单词 \w
或 space \s
字符出现一次或多次 (+
) 次。替换字符串 "&"
是用引号括起来的匹配模式 &
。 &
字符在 :help s/\&
中描述
我有以下列表:
[torunn,sentry,moonstone,avispa,phil coulson]
是否可以使用 Vim 将其更改为此?:
["torunn","sentry","moonstone","avispa","phil coulson"]
借助 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 魔法模式,然后匹配逗号或 (|
) 右括号。我们不需要转义括号,因为我们没有打开一个。
Substitute Ex 命令是处理 CSV 行的好工具
我经常使用替代 Ex 命令来处理 CSV。
在这种情况下,我只是通过字符范围匹配您的集合中的值:
[ a-zA-Z]
->类似于\w
,但是你的集合没有_0-9
,我们需要空格。
我使用转义括号将它放在一个字符组中。
此外,由于接下来可以有逗号或结束括号,我创建了另一个字符组并使用交替运算符允许任一字符:
\(,\|\]\)
在此处检查我们的模式匹配:
然后在替换字符串中引用这些字符组(并包括引号)。
综合起来,这里是替换命令:
:s/\([ a-zA-Z]\+\)\(,\|\]\)/""/g
之前:
之后:
减少过度设计的解决方案
正如@bimlas 所指出的,一个不那么过度设计的解决方案如下:
:s/[^,]\+/"[=15=]"/g
[=16=]
只是对整个匹配模式的引用(参见 :help [=17=]
)。
您可以使用替换:
s/\v(\w|\s)+/"&"/g
这将匹配单词 \w
或 space \s
字符出现一次或多次 (+
) 次。替换字符串 "&"
是用引号括起来的匹配模式 &
。 &
字符在 :help s/\&