3

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

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

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

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

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

提前致谢。

4

6 回答 6

9

假设您想对文件中的每一行都执行此操作,您可以像这样使用行号:

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

在哪里

  • execute(...)将字符串作为命令运行
  • % normal在文件的每一行上运行一个普通命令
  • A附加到该行
  • <C-R>=插入命令的结果
  • printf("%05d", ...)将第二个参数格式化为五位数字
  • line(".")获取当前行号
  • <CR>完成<C-R>=插入
于 2012-12-27T18:25:49.273 回答
2

如果您的文本块位于文件的开头。这意味着您要附加“00001”的行是文件的第一行,试试这个命令,我只是检查以 结尾的行ext,如果需要,您可以将其更改为正确的正则表达式:

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

如果文本块不在文件的开头。您只需检查块的第一行(要附加 00001 的行)并获取行号,例如行号 5:

:let b=5|%s/ext$/\="ext  ".printf("%05d", line(".")-b+1)/g
于 2012-12-27T20:41:45.063 回答
2

这是我的看法。

将光标定位在要添加第一个数字的第一行。
: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中的宏。

于 2012-12-28T08:55:01.957 回答
0

使用 awk 可以很容易地做到这一点。NR 变量为您提供记录编号,并且记录映射到行,除非重新定义 RS 变量。所以以下内容:

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

于 2012-12-27T18:27:05.000 回答
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 宏非常难看,但是当我太累而无法编写 oneliner 时它们对我很有用(不过我应该学习 awk)。此外,它们可以帮助您记住一些晦涩但有用的 vim 快捷方式。

于 2012-12-27T18:37:24.490 回答
0

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

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

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

于 2013-02-05T23:34:32.663 回答