我在想出一个 vim 查找/替换来删除除最后一个之外的所有单词时遇到问题,即在一些 SQL 中,从一堆代码中生成所有别名的列表会很好
select
column_a alias_a,
column_b alias_b,
column_c alias_c
from
...
我只想生成列表
alias_a, alias_b, alias_c
所以我想我想删除所有没有紧跟逗号和行尾的单词
选项 1:
%s/\v.*\s(\S+)$/\1/
选项 2:使用宏
qa$T d0jq
然后x@a
x 是您要应用此宏的行数
选项 3
转向外部命令:
:%!awk '$0=$NF'
选项 4:如果您有 Align 或类似插件,请将这些行对齐,然后使用c-v
块选择和删除,只需保留最后一列。
这应该这样做:
:%s/.* \(.*\)\n/\1 /
我会做:
:%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
几下以将别名放入一个逗号分隔的行中。
可视化选择行然后执行以下
:norm $bd0
:*j
注意::norm
将显示为:'<,'>
如需更多帮助,请参阅:
:h :norm
:h :j