在VIM中的每行末尾添加填充增量编号

在VIM中的每行末尾添加填充增量编号,vim,vi,Vim,Vi,我有一个包含列表的文本文件: dateformatfile.ext dateformatfile.ext dateformatfile.ext ... 我需要在每个结尾添加一个填充数字,如下所示: dateformatfile.ext 00001 dateformatfile.ext 00002 dateformatfile.ext 00003 ... 有很多,所以我需要有一个命令来做这件事 提前感谢。假设您要对文件中的每一行执行此操作,您可以使用如下行号: :execute "% norm

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

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

dateformatfile.ext 00001
dateformatfile.ext 00002
dateformatfile.ext 00003
...
有很多,所以我需要有一个命令来做这件事


提前感谢。

假设您要对文件中的每一行执行此操作,您可以使用如下行号:

:execute "% normal A \<C-R>=printf(\"%05d\", line(\".\"))\<CR>"
:执行“%normal A\=printf(\%05d\”,第行(\”)\”
在哪里

  • execute(…)
    将字符串作为命令运行
  • %normal
    在文件的每一行上运行普通命令
  • A
    追加到该行
  • =
    插入命令的结果
  • printf(“%05d”,…)
    将第二个参数格式化为五位数
  • line(“.”)获取当前行的编号
  • 完成
    =
    插入

    • 使用awk可以很容易地做到这一点。除非重新定义RS变量,否则,和记录将映射到行。因此,以下是:


      awk-e'{print$0 NR}文件名
      应该可以做到这一点。填充它们是留给读者的练习。

      我会使用宏(我喜欢宏: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
      
      qq-记录宏q
      $-走到队伍的尽头
      F-返回到最后一个空格
      “ay$-复制到缓冲区a中的行末尾
      j$-在下面一行的末尾
      “ap-复制缓冲区内容
      -增加数量
      q-停止录制宏
      
      现在,您可以使用1000@q(它将在文件末尾停止)

      这真的不漂亮,但它做的工作

      对于填充,我会使用另一个丑陋的把戏。首先,使用正则表达式匹配3位数字并在前面添加0,然后对2位数字执行相同操作(这次添加两个0),依此类推


      vim宏非常难看,但当我太累而无法编写一行程序时,它们对我很有用(不过我应该学习awk)。此外,它们还可以帮助您记住一些模糊但有用的vim快捷方式。

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

      :%s/ext$/\="ext  ".printf("%05d", line("."))/g
      
      如果文本块不在文件的开头。您只需检查块的第一行(要追加00001的行)并获取行号,例如,行号5:

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

      将光标放在要添加第一个数字的第一行。
      :让i=0
      定义一个变量来保存计数。
      qm
      开始将宏记录到寄存器m
      A=printf(“%05d”,i)
      添加一个空格和printf的输出。
      :让i+=1
      增加下一次宏执行的计数。
      q
      结束宏的录制

      jVG
      Visual选择文档中要添加数字的其余部分。
      :normal@m
      执行宏将数字添加到所选行

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

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

      :g/ext$/normal@m
      在以ext结尾的行上执行寄存器m中存储的宏。

      如果您的环境中有PERL,您可以在VIM会话中运行PERL one liner

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

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

      谢谢你,马修,这非常有效。我希望我能说出那样的话。多亏了其他的答案,我相信它们都能起作用。太好了,我很高兴它对你起作用。我已经每天使用Vim 15年了,我还在学习如何使用它:-)