![如何在 Vim 正常模式下捕获正则表达式命令的结果?](https://linux22.com/image/1270587/%E5%A6%82%E4%BD%95%E5%9C%A8%20Vim%20%E6%AD%A3%E5%B8%B8%E6%A8%A1%E5%BC%8F%E4%B8%8B%E6%8D%95%E8%8E%B7%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F%E5%91%BD%E4%BB%A4%E7%9A%84%E7%BB%93%E6%9E%9C%EF%BC%9F.png)
我想找出“x”在我的文件中出现的次数,因此我提交%s/x//gn
并得到了正确的答案。
如何在命令行上使用 vimscript 将结果计数捕获到变量中?
下面的答案暗示了以下解决方案:
:let cnt=0
:g/x/let cnt=cnt+1
:echo cnt
但是,cnt
用于存储缓冲区中包含 的总行数,而不是整个文件中有x
多少个。x
因此,原来的问题仍然存在。
答案1
Vim FAQ 回答了这个问题“我如何计算特定单词在缓冲区中出现的次数?”
答案2
你可以尝试一下
:let cnt=0
:g/^.*may/let cnt=cnt+1
:echo cnt
这样你就会看到有多少行至少出现一次“may”这个词。因此,以下文本将计为 1:
Your mileage may vary. You may have already won.
简单的。
答案3
下面的方法可以达到这个效果:
:echo eval(join(map(range(1, line('$')), 'len(substitute(getline(v:val),"[^x]","","g"))')," + "))
这将x
用空字符替换所有非字符,计算剩余字符的数量(应为x
s),并将文件中每一行的结果相加。
map
我从以下函数中获得了这种技术的想法丹尼斯·威廉森,在另一篇有关 Vim 脚本的文章中。