vi 删除指定范围的行,不用再反复按 dd

vi 删除指定范围的行,不用再反复按 dd

引言:为什么需要批量删除行?在编辑代码或文本文件时,我们经常需要删除大量连续的行。初学者可能会选择手动按 dd 删除每一行,但这种方法不仅效率低下,而且容易出错。vi 作为一款强大的文本编辑器,提供了多种批量删除行的方法,让您只需几个按键就能完成原本需要数百次重复操作的任务。本文将带您从基础到高级,逐步掌握 vi 中删除指定范围行的技巧。## 基础篇:理解 vi 的行号与范围在深入学习删除命令之前,我们需要先理解 vi 中的行号概念。vi 使用行号来标识每一行,行号从 1 开始递增。您可以通过以下命令查看当前行号:- :set number ------ 显示行号- :set nonumber ------ 隐藏行号vi 中的范围语法遵循 开始行号,结束行号 的格式,例如 1,10 表示第 1 行到第 10 行。范围可以包含特殊符号:- . ------ 当前行- $ ------ 最后一行- % ------ 所有行(等同于 1,$)## 初级用法:使用行号删除固定范围假设我们有一个包含 50 行的 Python 脚本,需要删除第 10 行到第 20 行。传统的 dd 方式需要按 11 次 dd,而使用行号范围只需::10,20d这个命令的含义是:删除从第 10 行到第 20 行的所有内容。命令中的 d 是 delete(删除)的缩写。示例代码 (Python 脚本,用于演示删除效果):python# 示例文件:example.pydef setup(): # 第1行 print("初始化开始") # 第2行 # 第3行 config = {"debug": True} # 第4行 # 第5行 print("配置完成") # 第6行 # 第7行 for i in range(10): # 第8行 # 第9行 print(f"步骤 {i}") # 第10行 # 第11行 if i % 2 == 0: # 第12行 # 第13行 print("偶数") # 第14行 # 第15行 else: # 第16行 # 第17行 print("奇数") # 第18行 # 第19行 print("循环结束") # 第20行 # 第21行在 vi 中打开此文件,输入 :8,19d 将删除第 8 行到第 19 行的所有代码,只保留第 1-7 行和第 20-21 行。## 中级用法:使用相对行号和搜索模式### 1. 相对行号删除有时候我们不知道具体行号,但知道相对位置。例如,从当前行开始删除接下来的 5 行::.,+5d这里的 . 表示当前行,+5 表示当前行之后的第 5 行。所以 .,+5d 会删除当前行到当前行之后第 5 行的共 6 行内容。### 2. 基于搜索模式的删除更强大的方式是使用正则表达式匹配来删除行。例如,删除所有包含 "debug" 的行::g/debug/d````g` 表示全局搜索,`/debug/` 是要匹配的模式,`d` 表示删除。这个命令会删除文件中所有包含 "debug" 字符串的行。**示例代码**(展示搜索删除的效果):python# 示例文件:data.pyimport sysdef process_data(items): # 调试信息 print("debug: 开始处理") results = \[\] for item in items: # 调试信息 print(f"debug: 处理 {item}") if item > 0: results.append(item * 2) else: print("跳过负值") # 调试信息 print("debug: 处理完成") return resultsdef main(): data = 1, -2, 3, -4, 5 output = process_data(data) print("最终结果:", output)在 vi 中执行 `:g/debug/d` 后,所有包含 "debug" 的行将被删除,只保留核心逻辑代码。## 高级用法:组合命令与条件删除### 1. 删除空行删除所有空行是常见需求,可以使用::g/^KaTeX parse error: Expected group after '^' at position 7: /d````^̲表示行首和行尾之间没有任何字符(即空行)。这个命令会删除所有空白行。### 2. 删除指定范围外的行有时我们需要保留某些行,删除其他所有行。例如,只保留第 5 行到第 15 行,删除其余所有行:```:1,4d:16,$d```先删除第 1-4 行,再删除第 16 行到末尾。### 3. 反向删除(保留匹配行)使用v 命令可以反向选择。例如,删除所有不包含 "error" 的行:```:g!/error/d````! 表示取反,所以这个命令会删除所有不匹配 "error" 的行。### 4. 使用正则表达式组合更复杂的模式组合,例如删除以 "#" 开头的注释行::g/^#/d删除空行和注释行::g/^$\|^#/d这里的 \| 表示逻辑或,匹配空行或以 # 开头的行。## 实战案例:批量清理日志文件假设有一个日志文件 app.log,内容如下:2024-01-01 INFO: 启动服务2024-01-01 DEBUG: 加载配置2024-01-01 ERROR: 连接数据库失败2024-01-01 WARN: 重试中2024-01-01 DEBUG: 重试第1次2024-01-01 INFO: 连接成功2024-01-01 DEBUG: 处理请求2024-01-01 ERROR: 超时我们需要删除所有 DEBUG 行,只保留 INFO、ERROR 和 WARN 行。使用::g/DEBUG/d执行后文件变为:2024-01-01 INFO: 启动服务2024-01-01 ERROR: 连接数据库失败2024-01-01 WARN: 重试中2024-01-01 INFO: 连接成功2024-01-01 ERROR: 超时## 效率技巧:结合可视模式除了命令行模式,vi 还提供了可视模式(Visual Mode)来直观选择行:1. 按下 V 进入行可视模式2. 移动光标选择多行3. 按下 d 删除选中的行例如,要删除第 10-20 行:1. 跳转到第 10 行(:10 回车)2. 按 V 进入可视模式3. 按 10j 向下移动 10 行4. 按 d 删除这种方法更适合视觉化操作,尤其适合不熟悉行号的情况。## 常见错误与注意事项1. 误删不可恢复 :vi 中的删除操作可以通过 u 撤销,但仅限于最近的操作。批量删除前建议先保存文件(:w)。2. 行号计算错误 :使用 1,10d 时,注意 110 都是包括在内的,共删除 10 行。3. 模式匹配过于宽泛 :使用 :g/pattern/d 时,确保模式足够精确,避免误删。4. 大文件性能 :对于超大文件(如几百 MB 的日志),vi 的删除操作可能会较慢,建议分段处理。## 总结通过本文的学习,您应该已经掌握了 vi 中删除指定范围行的多种方法:- 基础用法 :使用 :开始行,结束行d 按行号删除- 中级用法 :使用相对行号 .$ 和搜索模式 :g/pattern/d- 高级用法 :组合条件删除空行、注释行,以及反向删除- 实用技巧 :可视模式选择删除这些技巧将帮助您摆脱反复按 dd 的低效操作,大幅提升文本编辑效率。记住,vi 的强大之处在于它的命令组合能力,熟练掌握这些命令后,您将能像指挥家一样精确地控制文本处理流程。建议在日常编辑中多加练习,逐步从手动操作过渡到命令驱动的工作方式。

相关推荐
小码农 - 初2 小时前
MySQL前言
mysql
z落落2 小时前
StudentInfo表 分页、增删改 存储过程+C# WinForm 存储过程实现分页和增删改查
数据库·sql·mysql
影寂ldy2 小时前
WinForm 数据库【新增+编辑】完整功能(参数化查询+配置文件+防报错全套)
数据库
迷枫7122 小时前
达梦数据库 Hint 使用与 Hint 注入实战
数据库
Gauss松鼠会4 小时前
【GaussDB】GaussDB锁阻塞源头查询
java·开发语言·前端·数据库·算法·gaussdb·经验总结
2601_965798474 小时前
How to Build a Custom Artisan Store on WordPress: Crafti Theme Review
linux·服务器·数据库
霸道流氓气质4 小时前
Spring 事务传播机制与 REQUIRES_NEW
java·数据库·spring
YOU OU5 小时前
Redis分布式锁
数据库·redis·分布式
小草儿7995 小时前
GBase 8s CLOB → VARCHAR(32739) 数据迁移方案文档
数据库