如何使用sed或vi在文件行尾添加起始值大于1的连续序号
Vim 指定起始值添加连续序号解决方案
核心思路
Vim替换命令中\=后支持表达式计算,你只需要在行号line('.')的基础上加上偏移量即可实现自定义起始序号,偏移量 = 期望起始值 - 1。
方案1:偏移量硬编码(单次使用最快)
比如你要从38开始,偏移量就是38-1=37:
- 给行首加序号:执行命令
:%s/^/\=(line('.') + 37)/ - 给行尾加序号:执行命令
:%s/$/\=(line('.') + 37)/
如果是生成192.168.44.x格式的IP,每行已有192.168.44.前缀的话,直接用上面行尾加序号的命令即可。如果前缀末尾没有带.,可以修改命令自动补全::%s/$/\=".". (line('.') + 37)/
方案2:变量定义起始值(多次调整更方便)
你可以先定义起始值变量,后续修改只需要改变量值即可,不需要重新计算偏移量:
- 先执行命令定义起始值:
:let start_num = 38 - 再执行替换命令:
- 行首加:
:%s/^/\=(start_num + line('.') - 1)/ - 行尾加:
:%s/$/\=(start_num + line('.') - 1)/
- 行首加:
方案3:批量处理多文件(无需打开Vim)
如果需要批量处理多个文件,可以直接用Shell的awk命令实现:awk '{print $0 (NR + 37)}' 原文件.txt > 新文件.txt
要补全IP末尾的.的话,修改命令为:awk '{print $0"." (NR + 37)}' 原文件.txt > 新文件.txt
局部行处理
如果不需要处理整个文件,只需要处理指定行范围,把命令开头的%替换为行范围即可,比如处理第3行到第15行:
:3,15s/$/\=(line('.') + 37)/
内容的提问来源于stack exchange,提问作者nlcorbett
相关产品推荐
相关产品推荐

