如何使用vi/vim命令对文件指定行范围的内容重新编号
Vim对指定范围行重新编号的解决方法
原命令失效原因
你之前使用的:2,$s/^\([^,]\)// | 2,$!cat -n没有得到预期结果,主要有两个问题:
- Vim命令行中的
|是连续执行两个命令的分隔符,不是管道传值逻辑,前一步替换删除行首到第一个逗号的内容后,后一步调用cat -n是直接把2到最后一行的内容传入cat处理 cat -n默认输出的编号和内容之间用空格/制表符分隔,没有用逗号拼接,不符合CSV格式的要求
正确操作方法
方法1:使用Vim内置功能(无需调用外部命令,最稳妥)
直接执行下面的命令即可完成替换:
:let i=1 | 2,$s/^\d\+/\=i/ | let i+=1
逻辑说明:
- 先定义变量i初始值为1
- 对2到最后一行的行首数字进行替换,替换值为表达式返回的i值
- 每次替换完成后i自增1,实现序号递增
方法2:调用外部nl命令实现
如果要使用外部命令处理,可以先删除2到最后一行行首到第一个逗号的内容,再调用nl指定分隔符:
- 先执行替换删除原有编号:
:2,$s/^[^,]*// - 选中2到最后一行,执行命令:
:'<,'>!nl -s ',' -w 1
参数说明:
-s ','指定编号后的分隔符为逗号-w 1指定编号宽度为1,避免生成前导空格
内容的提问来源于stack exchange,提问作者DOS HASAN
相关产品推荐
相关产品推荐

