2017-10-16 118 views
1

我有一个yaml文件,其中有一长串编号字段。使用任何编辑器在yaml文件中重新编号列

1:first 
    . 
    .  
22: this 
23: that 
24: somethingelse 
22: this2 
23: that2 
24: somethingelse2 
etc 

我试图去

1: first 
    . 
    . 
    . 
22: this 
23: that 
24: somethingelse 
25: this2 
26: that2 
27: somethingelse2 

我需要做的是重新编号开始在限定数量高达约400(每个文件多次)这些字段。

在vim,atom或sublime中必须有一种方法可以做到这一点,但我正在努力寻找一种方法。

递增数字似乎在vim中与^ X一起工作,但是我真的需要把我重新编号的列上面的数字添加到它,并将文本替换为:使用该数字。它可能是一个正则表达式的问题,以获得选择权和一个宏,使其工作,但我不能解决。

+1

请为上面的示例提交所需的输出,但不清楚你想要什么。 –

+0

我发现:/ \ d \ {1,3}:/将在行的开头选择数字(包括:)。宏从那里工作? –

+0

您可以使用专为编号设计的工具 - 'nl'。删除所有数字(你可以用可视块模式做到这一点),然后选择你想要重新编号的所有文件,然后输入'!nl -ba -w2 -s“:”' – aragaer

回答

3

看看这里的细节:How to replace finding words with the different in each occurrence in VI/VIM editor ?

像这样的东西应该工作:

:let @a=1 | %s/^\s*\zs\d\{1,3}\ze:/\=(@a+setreg('a',@a+1))/g 

当然可以适应@a您的需求。如您所见,您的\d\{1,3}仍在使用中。但要确保只有正确的部分匹配,它会查找该行的开头。此外,它不取代:但检查它。这可以通过\zs\ze来实现。请参阅:h \ze获取更多信息

+0

谢谢医生,那有效。我所做的也是记录一个宏,将上面一行中的数字写入一个寄存器,用它替换当前的数字,然后用递增,然后向下移动一行。尽管不如您的解决方案高效。 –