2012-12-27 59 views
2

结束每一行的我在它与列表的文本文件:添加软垫递增编号在VIM

dateformatfile.ext 
dateformatfile.ext 
dateformatfile.ext 
... 

我需要一个软垫号码添加到每个月底,像这样:

dateformatfile.ext 00001 
dateformatfile.ext 00002 
dateformatfile.ext 00003 
... 

有很多,所以我需要有一个命令来做到这一点。

在此先感谢。

回答

6

假设你想在你的文件中的每一行做到这一点,你可以用这样的行号:

:execute "% normal A \<C-R>=printf(\"%05d\", line(\".\"))\<CR>" 

其中

  • execute(...)运行字符串命令
  • % normal在文件的每一行上运行正常命令
  • A附加到行
  • <C-R>=插入一个命令
  • printf("%05d", ...)格式化所述第二参数作为五位数字
  • line(".")的结果获取当前行的
  • <CR>数完成<C-R>=插入
+0

谢谢马修,完美的工作。我希望我能拿出那样的东西。也感谢其他答案,我相信他们都可以工作。 – j0nr

+0

太棒了,我很高兴它为你工作。我一直在使用Vim每天使用15年,我仍然在学习如何使用它:-) –

0

人们可以使用awk很容易做到这一点。 NR variable gives you the record number,并记录映射到行,除非重新定义RS变量。所以如下:

awk -e '{ print $0 NR }' filename应该做的伎俩。填充它们是留给读者的练习。

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位数字(此时添加两个0)来执行相同的操作,依次类推...

vim宏很丑,但它们很有用对我来说,当我厌倦写一个指纹时(我应该学习awk)。此外,它们可以帮助您记住一些晦涩难懂的vim快捷方式。

1

如果您的文本块位于文件的开头。这意味着要追加“00001”该行是文件的第一行,试试这个命令,我只是简单地检查与ext结束行了,你可以把它是否需要将其更改为正确的正则表达式:

:%s/ext$/\="ext ".printf("%05d", line("."))/g 

如果文本块不在文件的开头。你刚才检查第一线的块,并得到行号(要追加00001行),例如,行数5:

:let b=5|%s/ext$/\="ext ".printf("%05d", line(".")-b+1)/g 
1

这是我服用。

将光标定位在要添加第一个数字的第一行上。
:let i=0定义一个变量来保存计数。
qm开始将宏记录到寄存器m
A <C-R>=printf("%05d", i)<CR><ESC>添加一个空格和printf的输出。
:let i+=1递增下一次宏执行的计数。
q结束宏的记录。

jVG可视化选择我们想要添加数字的文档的其余部分。
:normal @m执行宏以将数字添加到选定的行。

我认为这种做法有一定的优势:

  • 没有丑陋的逃避必要的。
  • 计数不与行号绑定。允许偏移。
  • 使用宏可以很容易地与:global命令组合使用。例如:

:g/ext$/ normal @m执行宏存储在在分机结束行寄存器

0

如果您的环境中有PERL,则可以在VIM会话中单行运行PERL。

:%! perl -pe " $count++ ; s/$/$count/" 

需要注意的是,您可能必须在perl脚本周围使用双引号。在我的PC上,如果我使用单引号,PERL将运行。但我无法用美元符号来解决变数。