7

我在想出一个 vim 查找/替换来删除除最后一个之外的所有单词时遇到问题,即在一些 SQL 中,从一堆代码中生成所有别名的列表会很好

select 
column_a alias_a,
column_b alias_b,
column_c alias_c

from 
...

我只想生成列表

alias_a, alias_b, alias_c

所以我想我想删除所有没有紧跟逗号和行尾的单词

4

4 回答 4

10

选项 1

%s/\v.*\s(\S+)$/\1/

选项 2:使用宏

qa$T d0jq

然后x@ax 是您要应用此宏的行数

选项 3

转向外部命令:

:%!awk '$0=$NF'

选项 4:如果您有 Align 或类似插件,请将这些行对齐,然后使用c-v块选择和删除,只需保留最后一列。

于 2013-04-05T20:38:36.473 回答
4

这应该这样做:

:%s/.* \(.*\)\n/\1 /
于 2013-04-05T20:25:59.710 回答
3

我会做:

:%s/\v(.*\s)(\w\+)/\2/

这意味着将直到最后一个空间的所有内容都抓取到捕获组 1 中,然后将所有内容抓取到捕获组 2 中,然后将其替换为仅捕获组 2。

替换这个:

select 
column_a blah blah blah alias_a,
column_b foo foo foo alias_b,
column_c bar bar bar alias_c

from 

到:

select 
alias_a,
alias_b,
alias_c

from 

然后,您可以打Shift-J几下以将别名放入一个逗号分隔的行中。

于 2013-04-05T20:22:14.850 回答
0

可视化选择行然后执行以下

:norm $bd0
:*j

注意::norm将显示为:'<,'>

如需更多帮助,请参阅:

:h :norm
:h :j
于 2013-04-05T22:10:14.890 回答