Vim:如何搜索和替换每行的一部分?

cpjpxq1n  于 5个月前  发布在  其他
关注(0)|答案(5)|浏览(101)

我有一个带空格的短语列表:

Part One
Part Two
Parts Three And Four

字符串
我想使用Vim来处理列表,以生成以下内容:

part_one,"Part One"
part_two,"Part Two"
parts_three_and_four,"Parts Three And Four"


我可以使用这个regex:

:%s/.*/\L\0\E,"\0"/


让我看到了这个,这真的很接近:

part one,"Part One"
part two,"Part Two"
parts three and four,"Parts Three And Four"


有没有办法把逗号前的所有空格都替换成下划线?或者是对上面的正则表达式的修改,或者是作为第二个命令?

im9ewurl

im9ewurl1#

假设原始数据中永远不会有逗号,您应该能够使用以下内容:

:%s/.*/\L\0\E,"\0"/ | %s/ \([^,]*,\)\@=/_/g

字符串
这只是在当前替换之后执行另一个替换,以替换逗号之前的所有空格(使用正向前瞻)。

r7xajy2e

r7xajy2e2#

:g/./let @s='"'.getline('.').'"'|s/ /_/g|exec "norm! guuA,\<ESC>\"sp"

字符串
如果我这样做,我可以用宏来做。

nbewdwxp

nbewdwxp3#

您可以尝试在替换部分中使用表达式,例如:

:%s/\v^.*$/\=tolower(substitute(submatch(0), "\\s\\+", "_", "g")) . ",\"" . submatch(0) . "\""/

字符串
它首先将所有空格替换为_,返回的字符串为小写,然后将结果与用双引号括起来的匹配行连接。
它产生:

part_one,"Part One"
part_two,"Part Two"
parts_three_and_four,"Parts Three And Four"

gblwokeq

gblwokeq4#

从你停下来的地方,我会把逗号后面的所有行分开:

:%s/,/,\r/

字符串
然后你可以用逗号替换行上的空格,并将行重新连接在一起:

:g/,/:s/ /_/g|j!

hi3rlvi2

hi3rlvi25#

您可以使用第二个命令:

:%s/\(\(,.*\)\@<=\)\@! /_/g

字符串
\(\(,.*\)\@<=\)\@!逆匹配,"Part One","Part Two".
还有:

:%s/ \(.*"..*\)\@=/_/g

相关问题