我想在每一行的末尾插入该行的字母字符数。要在一条线上这样做很容易。我使用:s/\a//gn
进行搜索并在命令行中出现字母字符,然后A
和空格并输入数字。
当我有这么多行时,问题就出现了,这样做变得非常繁琐。我正在尝试创建一个宏,但很难获得命令行输出。有没有办法在不使用* nix命令的情况下执行此操作?我可以访问* nix框,但不是所有时间。
因此,如果我的文件包含以下内容:
abc2d4s
jd4a5ag
jdf7fjf
abdd5ff
我希望输出看起来像这样:
abc2d4s 5
jd4a5ag 5
jdf7fjf 6
abdd5ff 6
我在想是否有办法让替换输出以某种方式通过管道进入寄存器,但无法弄清楚如何做到这一点,但也许有更好的方法。
答案 0 :(得分:4)
您可以使用:s///gn
捕获:redir
命令的输出,但在这种情况下,我宁愿通过substitute()
和:help sub-replace-expression
实现计数:
:%s/.*/\=submatch(0) . ' ' . len(substitute(submatch(0), '\A', '', 'g'))/
这匹配整行(.*
),然后删除所有非字母字符(\A
),并追加结果的长度。注意:仅适用于ASCII字符(但\a
仅涵盖那些字符)!
答案 1 :(得分:2)
这样做的一种方法是使用一个简单的宏:
:%norm A <C-v><C-r>=col('.')-2<C-v><CR>
应该是这样的:
:%norm A ^R=col('.')-2^M
我们在每行的末尾输入插入模式并插入一个空格,后跟最后一个字符的列号。
变体:
:%norm A^R=" ".len(getline('.'))^M
答案 2 :(得分:2)
这个cmd应该给你输出:
%s/.*/\=submatch(0).' '.(len(submatch(0))-len(substitute(submatch(0),'\a','','g')))