假设我有一个包含以下内容的文本文件:
ABRADER AH B R EY D AH
ABRADER AH B R EY D AH R
ABRADERS AH B R EY D AH Z
ABRADES AH B R EY D Z
APRIL EY P R AH L
APRIL EY P R AH
APRIL EY AH P R AH
我想执行一个查找重复项的vim命令,并在每个重复的单词中添加一个计数器(括号内),但它只检查每行中的第一个单词。在当前示例中,生成的文本应为:
ABRADER AH B R EY D AH
ABRADER(2) AH B R EY D AH R
ABRADERS AH B R EY D AH Z
ABRADES AH B R EY D Z
APRIL EY P R AH L
APRIL(2) EY P R AH
APRIL(3) EY AH P R AH
答案 0 :(得分:3)
这转向外部awk
来完成这项工作。执行命令后,格式可能会混乱(空格数)。但它会以所需格式为您提供出现次数。
%!awk 'a[$1]++{$1=$1"("a[$1]")"}7'
对齐可以通过其他插件或vim-fu来实现,如果你喜欢它也可以通过awk完成,但代码会比上面的更长。
答案 1 :(得分:0)
这是一个纯粹的Vim解决方案,模仿@ Kent的awk
解决方案(为了便于阅读,oneliner在这里分为多行):
let d = {} |
\ global/^\S/
\ let cw = expand('<cword>') |
\ let d[cw] = get(d, cw, 0) + 1 |
\ if d[cw] > 1 |
\ execute 'normal! elgR(' . d[cw] . ')' |
\ endif
计算第一个单词的出现次数(<cword>
; :global
将光标放在每个非空行(^\S
)的开头,并使用{{1}在不影响现有对齐的情况下附加计数。