繁体   English   中英

如何使用 vi 或 Vim 在文件中生成数字序列?

[英]How to generate a number sequence in file using vi or Vim?

有没有办法在vi或Vim中生成一个数字序列?

例如,对于在 Vim 中打开的文件中的任意范围的行ij (其中i < j ),是否有一种方法可以生成从第i行的数字 1 一直到数字 ( ji + 1)第j行?

说,我在文件中有以下几行:

this is line #1
this is line #2
this is line #3
this is line #4
this is line #5
this is line #6
this is line #7
this is line #8
this is line #9
this is line #10

我想在第 4 行到第 8 行的数字序列前加上数字 1 到 5。运行后,生成的文件应该如下所示:

this is line #1
this is line #2
this is line #3
1 this is line #4
2 this is line #5
3 this is line #6
4 this is line #7
5 this is line #8
this is line #9
this is line #10

如果可能的话,有没有办法对生成的序列使用不同的步长? 例如,是否可以将 2 用作步长,以便生成的序列为 2、4、6、8 等?

注:问题“ How to add line numbers to range of lines in Vim?” 》提出了类似的问题,但又不尽相同。

Vim 7.4.754开始,可以使用g Ctrl-a ,请参阅:help v_g_CTRL-A

转到第 4 行,使用Ctrl-v 逐块选择第一个字符,向下移动 4 行,按Shift i ,输入0 (这是0 ,然后是Space )和Esc退出插入模式。

现在使用gv重新选择以前选择的区域。 g Ctrl-a创建一个序列。

我在这里从0开始,所以我可以通过gv重新选择。 如果从1开始,则需要手动重新选择,同时省略第一个1

使用2g Ctrl-a使用 2 的步数。


演示如何生成数字序列的屏幕截图

V (Shift-v) 选择几行,然后在下面输入命令:

:let i=1 | '<,'>g/^/ s//\=i . " "/ | let i+=2

输入:help sub-replace-expression以阅读更多信息。

您可以简单地使用带有CTRL-a函数的宏来增加前导数字,而不是复杂的构造。 示例数据:

aaa
bbb
ccc

首先插入一个起始编号和一个空格

1 aaa
bbb
ccc

然后在第 1 行记录此宏( <Ca>表示CTRL-a ):

qq0yf 0j0P0<C-a>q

解释:

  1. qq : 将宏记录到寄存器q
  2. 0 :转到第一列。
  3. yf : 猛拉所有直到并包括第一个空格(记住你的第一行有1和一个空格)。
  4. 0jP :向下并将图案粘贴到行首。
  5. 0<Ca> :转到第一列并将数字增加一。
  6. q : 结束宏录制。

这给出:

1 aaa
2 bbb
ccc

现在,您可以根据需要使用@q应用此宏。 如果您需要增加两个,只需使用CTRL-a CTRL-a而不是一次。 现在您可以将此宏应用于连续行,例如:

:.,$norm @q

将为文件的其余部分添加前导行号。

:4,8s/^/\=line(".")-3." "    

会做你想做的

如果您需要 count=2:

:4,8s/^/\=2*(line(".")-3)." " 

这会给你 2,4,6,8,10

在我的示例中,行号是硬编码的,您可以使用 V 来选择要更改的行。

这是一个肮脏的把戏,但生活就是由这些组成的。 :)

ESC :r! for i in $(seq 1 10); do echo "This is line \#${i}"; done

不跨平台。

我认为所有建议的解决方案都很难记住,您可以使用一次,但每次使用时都需要详细了解所有细节(如果您每天使用的时间少于一次左右)。

我发现视觉增量脚本非常易于安装和使用。 一旦它安装在 vim 中,你只需要生成一列 0,用 Ctrl-V 选择它并编写命令:I。 然后它会在每一行上自动生成递增的数字。 还有其他功能:

  • 以非 0 的数字开头
  • 带有 0 的左或右填充数字(如 001、...、015)
  • 减少或增加数字
  • 增加1个以上
  • 日期(但你需要一个额外的插件)、字母、日期

这解决了一个更普遍的问题,因为它也可以在与第 0 列不同的位置工作,只需使用 Ctrl-V 可选择该列。

插件的 vimball 在这里这里

在可视模式下选择目标行,然后运行 ​​Ex 命令

:'<,'>s/^/\=(line('.')-line("'<")+1).' '

(如果你的 vim 有 Perl 支持——在许多 Linux 发行版中是默认的):选择可视模式 (V) 中的行并执行

:perldo s/^/++$z . " "/e

要么

:4,8 perldo s/^/++$z . " "/e

Nexus插件提供 Series 类型和该类型的对象s1 ,如下所示:

:4,8s/^/\=s1.next().' '/

Nexus 还带有一个s0系列对象,它的第一个.next()结果产生 0。 s0s1使用 1 步增量。 所有 Series 对象都有一个.reset()方法,可以将它们设置回.reset()值。 可以像以下调用一样创建新的系列对象:

let s2 = Series(0, 2)

这将创建一个满足您的第二个请求的两步对象(产量:2、4、6、8 等)。

您还可以使用nlcat -n等。

  1. Select 行在正常模式下使用V Shift-v
  2. 切换到命令模式:
  3. 在提示符:<,>键入!nl或类似.nl -s .\

就个人而言,我永远不记得投票最高的答案的方法,并且总是最终回到这里

这些方法中的任何一种都有效

一种不太灵活但易于记忆的方法是使用重新编号插件,如 Renumber.vim http://www.vim.org/scripts/script.php?script_id=189

如果还没有任何数字,就像在 OP 中一样,应该在它们的位置插入一些数字。 Renumber 可以处理实际的排序,它只根据第一个数字进行排序。

在本例中,我使用<Cv>在您想要编号的所有行上插入起始编号。

4G<Cv>4jGI1 <Esc>gv:Renumber

使用两个步骤

:Renumber s2

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM