将填充的增量数添加到VIM中每行的末尾

时间:2012-12-27 18:02:52

标签: vim vi

我有一个包含列表的文本文件:

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

我需要在每个末尾添加一个填充数字,如下所示:

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

有很多,所以我需要有一个命令以某种方式这样做。

提前致谢。

6 个答案:

答案 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执行宏以将数字添加到所选行。

我认为这种方法有一些优点:

  • 没有必要逃避丑陋。
  • 计数与行号无关。允许抵消。
  • 使用宏可以轻松地与:global 命令结合使用。例如:

: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将会运行。但我不能用美元符号来解决变量。