vim,每次在文本中重复单词时,是否可以在单词旁边添加增加的数字?

时间:2015-04-01 10:32:34

标签: vim

假设我有一个包含以下内容的文本文件:

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 

2 个答案:

答案 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}在不影响现有对齐的情况下附加计数。