我有一个包含列表的文本文件:
dateformatfile.ext
dateformatfile.ext
dateformatfile.ext
...
我需要在每个末尾添加一个填充数字,如下所示:
dateformatfile.ext 00001
dateformatfile.ext 00002
dateformatfile.ext 00003
...
有很多,所以我需要一个命令来以某种方式做到这一点。
提前致谢。
假设您想对文件中的每一行都执行此操作,您可以像这样使用行号:
:execute "% normal A \<C-R>=printf(\"%05d\", line(\".\"))\<CR>"
在哪里
execute(...)
将字符串作为命令运行% normal
在文件的每一行上运行一个普通命令A
附加到该行<C-R>=
插入命令的结果printf("%05d", ...)
将第二个参数格式化为五位数字line(".")
获取当前行号<CR>
完成<C-R>=
插入如果您的文本块位于文件的开头。这意味着您要附加“00001”的行是文件的第一行,试试这个命令,我只是检查以 结尾的行ext
,如果需要,您可以将其更改为正确的正则表达式:
:%s/ext$/\="ext ".printf("%05d", line("."))/g
如果文本块不在文件的开头。您只需检查块的第一行(要附加 00001 的行)并获取行号,例如行号 5:
:let b=5|%s/ext$/\="ext ".printf("%05d", line(".")-b+1)/g
这是我的看法。
将光标定位在要添加第一个数字的第一行。
:let i=0
定义一个变量来保存计数。
qm
开始将宏记录到寄存器m中。
A <C-R>=printf("%05d", i)<CR><ESC>
添加一个空格和 printf 的输出。
:let i+=1
增加下一个宏执行的计数。
q
结束宏的录制。
jVG
视觉选择我们要添加数字的文档的其余部分。
:normal @m
执行宏将数字添加到选定的行。
我认为这种方法有一些优点:
:g/ext$/ normal @m
在以ext结尾的行上执行存储在寄存器m中的宏。
使用 awk 可以很容易地做到这一点。NR 变量为您提供记录编号,并且记录映射到行,除非重新定义 RS 变量。所以以下内容:
awk -e '{ print $0 NR }' filename
应该做的伎俩。填充它们是留给读者的练习。
我会使用宏来做到这一点(我喜欢宏:D)。
首先,让我们处理一下数字(稍后我们将填充它们)。在第一行的末尾手动添加数字 1。然后在第一行记录这个宏:
qq - record the macro q
$ - go at the end of the line
F<space> - go backward to the last space
"ay$ - copy till the end of the line in the buffer a
j$ - go at the end of the line below
"ap - copy the buffer content
<ctrl+A> - increment the number
q - stop recording the macro
现在您可以使用1000@q多次应用它(它将在文件末尾停止)。
这不是很漂亮,但它可以完成工作。
对于填充,我会使用另一个丑陋的技巧。首先,使用正则表达式匹配 3 位数字并在前面添加 0,然后对 2 位数字执行相同操作(这次添加两个 0)等等...
vim 宏非常难看,但是当我太累而无法编写 oneliner 时它们对我很有用(不过我应该学习 awk)。此外,它们可以帮助您记住一些晦涩但有用的 vim 快捷方式。
如果您的环境中有 PERL,则可以在您的 VIM 会话中运行 PERL 单行程序。
:%! perl -pe " $count++ ; s/$/$count/"
需要注意的是,您可能必须在 perl 脚本周围使用双引号。在我的 PC 上,如果我使用单引号,PERL 将运行。但是我不能用美元符号来处理变量。