我有一个包含列表的文本文件:
dateformatfile.ext
dateformatfile.ext
dateformatfile.ext
...
我需要在每个末尾添加一个填充数字,如下所示:
dateformatfile.ext 00001
dateformatfile.ext 00002
dateformatfile.ext 00003
...
有很多,所以我需要有一个命令以某种方式这样做。
提前致谢。
答案 0 :(得分:8)
假设您要对文件中的每一行执行此操作,您可以使用如下行号:
:execute "% normal A \<C-R>=printf(\"%05d\", line(\".\"))\<CR>"
,其中
execute(...)
将字符串作为命令运行% normal
在文件的每一行上运行正常命令A
附加到该行<C-R>=
插入命令的结果printf("%05d", ...)
将第二个参数格式化为五位数字line(".")
获取当前行的编号<CR>
完成<C-R>=
插入答案 1 :(得分:1)
如果您的文本块位于文件的开头。这意味着您要追加“00001”的行是您文件的第一行,请尝试此命令,我只需检查以ext
结尾的行,如果需要,您可以将其更改为正确的正则表达式:< / p>
:%s/ext$/\="ext ".printf("%05d", line("."))/g
如果文本块不在文件的开头。您只需检查块的第一行(您要追加00001的行)并获取行号,例如行号5:
:let b=5|%s/ext$/\="ext ".printf("%05d", line(".")-b+1)/g
答案 2 :(得分:1)
这是我的看法。
将光标放在要添加第一个数字的第一行
: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 中的宏。
答案 3 :(得分:0)
使用awk很容易做到这一点。除非重新定义RS变量,否则NR variable gives you the record number和记录映射到行。以下是:
awk -e '{ print $0 NR }' filename
应该做到这一点。填充它们是一个留给读者的练习。
答案 4 :(得分:0)
我会使用宏来做这件事(我喜欢宏: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位数字进行相同操作(此时加2 0)依此类推......
vim宏非常难看,但是当我太累而不能写一个oneliner时,它们对我很有用(尽管我应该学习awk)。此外,它们可以帮助您记住一些模糊但有用的vim快捷方式。答案 5 :(得分:0)
如果你的环境中有PERL,你可以在你的VIM会话中运行PERL单行。
:%! perl -pe " $count++ ; s/$/$count/"
需要注意的是,您可能必须在perl脚本周围使用双引号。在我的电脑上,如果我使用单引号,PERL将会运行。但我不能用美元符号来解决变量。