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

问题描述 投票:0回答:5

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

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"

我可以使用这个正则表达式:

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

让我明白这一点,这真的很接近:

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

有什么方法可以用下划线替换每个逗号之前的所有空格吗?作为上述正则表达式的修改还是作为第二个命令?

regex vim vi
5个回答
4
投票

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

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

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


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

如果我这样做,我可能会用宏来做。


0
投票

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

:%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"

0
投票

从你离开的地方开始,我会拆分逗号后的所有行:

:%s/,/,\r/

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

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

0
投票

您可以用作第二个命令:

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

\(\(,.*\)\@<=\)\@!
反向匹配
,"Part One"
,
,"Part Two"
...

© www.soinside.com 2019 - 2024. All rights reserved.