[英]How to generate a number sequence in file using vi or Vim?
有没有办法在vi或Vim中生成一个数字序列?
例如,对于在 Vim 中打开的文件中的任意范围的行i到j (其中i < j ),是否有一种方法可以生成从第i行的数字 1 一直到数字 ( j − i + 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?” 》提出了类似的问题,但又不尽相同。
用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
解释:
qq
: 将宏记录到寄存器q
0
:转到第一列。yf
: 猛拉所有直到并包括第一个空格(记住你的第一行有1
和一个空格)。0jP
:向下并将图案粘贴到行首。0<Ca>
:转到第一列并将数字增加一。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 列不同的位置工作,只需使用 Ctrl-V 可选择该列。
在可视模式下选择目标行,然后运行 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。 s0
和s1
使用 1 步增量。 所有 Series 对象都有一个.reset()
方法,可以将它们设置回.reset()
值。 可以像以下调用一样创建新的系列对象:
let s2 = Series(0, 2)
这将创建一个满足您的第二个请求的两步对象(产量:2、4、6、8 等)。
您还可以使用nl
、 cat -n
等。
V
Shift-v
。:
:<,>
键入!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.