当前位置: 首页 > ds >正文

Vim 调用外部命令学习笔记

Vim 外部命令集成完全指南

文章目录

  • Vim 外部命令集成完全指南
    • 核心概念理解
      • 命令语法解析
      • 语法对比
    • 常用外部命令详解
      • 文本排序与去重
      • 文本筛选与搜索
      • 高级 grep 搜索技巧
      • 文本替换与编辑
      • 字符处理
      • 高级文本处理
      • 编程语言处理
      • 其他实用命令
    • 范围操作示例
      • 指定行范围处理
      • 复合命令示例
    • 实用技巧与最佳实践
      • 1. 备份重要文件
      • 2. 预览命令结果
      • 3. 撤销操作
      • 4. 常用组合技巧
        • 数据清理流水线
        • 日志分析
        • CSV 数据处理
    • 常见应用场景
      • 1. 代码整理
      • 2. 数据分析
      • 3. 文档处理
    • 注意事项

在 Vim 中, :%! 命令是一个强大的功能,它允许你将文件内容通过管道传递给外部命令处理,并用命令输出替换原文件内容。这个功能极大地扩展了 Vim 的文本处理能力,让你可以利用 Unix/Linux 系统中丰富的命令行工具。

核心概念理解

命令语法解析

  • :%! :对整个文件应用外部命令并用命令输出替换文件内容
  • :! :执行外部命令,但不改变文件内容
  • % :代表整个文件范围(从第一行到最后一行)
  • ! :调用外部命令的执行符号

语法对比

命令格式作用说明是否修改文件
:%!command对整个文件应用外部命令,用输出替换文件内容
:!command执行外部命令,显示结果但不修改文件
:range!command对指定范围应用外部命令

常用外部命令详解

文本排序与去重

命令功能描述示例
:%! sort对文件内容进行排序按字母顺序排列所有行
:%! sort -u排序并删除重复行去重并排序
:%! sort -n按数字大小排序数值排序而非字典序
:%! sort -r逆序排序倒序排列
:%! sort -k2按第二列排序指定列排序
:%! uniq删除相邻的重复行需要先排序

文本筛选与搜索

命令功能描述示例
:%! grep pattern筛选包含特定模式的行过滤匹配行
:%! grep -v pattern筛选不包含特定模式的行反向过滤
:%! grep word -B1显示匹配行及其前1行上下文显示
:%! grep word -A1显示匹配行及其后1行上下文显示
:%! grep -i pattern不区分大小写搜索忽略大小写

高级 grep 搜索技巧

命令功能描述
:%! grep 'A\|B'搜索包含 A 或 B 的行(使用单引号)
:%! grep 'A' \| grep 'B'搜索同时包含 A 和 B 的行
:%! grep 'A.*B'搜索包含 A 和 B 的行(A 在 B 前面)
:%! grep -E '(A.*B\|B.*A)'搜索同时包含 A 和 B,顺序不限

文本替换与编辑

命令功能描述示例
:%! sed 's/old/new/g'全局替换文本将所有 old 替换为 new
:%! sed '/pattern/d'删除匹配模式的行删除包含 pattern 的行
:%! sed '/pattern/,+2d'删除匹配行及后续N行删除匹配行及后2行

字符处理

命令功能描述示例
:%! tr 'a-z' 'A-Z'小写转大写字符转换
:%! tr -d ' '删除空格字符删除
:%! tr -s ' '压缩重复空格多个空格变一个

高级文本处理

命令功能描述示例
:%! awk '{print $1,$2}'输出第1列和第3列列提取
:%! awk 'NF==10 && $4>0.8}'条件筛选并输出指定列复合条件处理
:%! awk -F'[()]' '{print $2}'自定义分隔符提取以括号为分隔符
:%! column -t格式化为表格列对齐显示

编程语言处理

命令功能描述示例
:%! perl -ne 'print scalar reverse $_'Perl 逐行反转复杂文本处理
:%! python -c "import sys; [print(int(line)*2) for line in sys.stdin]"Python 数值处理每行乘以2

其他实用命令

命令功能描述应用场景
:%! xargs echo将多行合并为一行格式转换
:%! gzip/:%! gunzip压缩/解压内容文件压缩
:%! base64/:%! base64 -dBase64编码/解码编码转换

范围操作示例

指定行范围处理

命令功能描述
:9,23! sort -u只对第9-23行进行排序去重
:1,10! grep pattern只在前10行中搜索
:.,1}'从当前行到文件末尾提取第一列

复合命令示例

" 复杂的数据处理流水线
:8,$! awk -F '[()]' '{print $1,$2}' | grep /I | sed 's/\/I/ /g'

这个命令的处理流程:

  1. 从第8行开始到文件末尾
  2. 以括号为分隔符,提取第1、2列
  3. 筛选包含 /I 的行
  4. /I 替换为空格

实用技巧与最佳实践

1. 备份重要文件

在使用 :%! 命令前,建议先保存或备份文件:

:w backup.txt    " 备份当前文件
:%! command      " 执行外部命令

2. 预览命令结果

使用 :! 先预览命令效果:

:! sort filename | head -10    " 预览排序结果的前10行
:%! sort                       " 确认无误后执行

3. 撤销操作

如果命令结果不满意,可以使用撤销:

u    " 撤销上一次操作

4. 常用组合技巧

数据清理流水线
:%! sort | uniq | grep -v '^$'    " 排序 → 去重 → 删除空行
日志分析
:%! grep ERROR | sort | uniq -c | sort -nr    " 错误统计并按频率排序
CSV 数据处理
:%! awk -F',' '{print $1","$3}' | sort    " 提取第1、3列并排序

常见应用场景

1. 代码整理

  • 去除重复的 import 语句
  • 按字母顺序排列函数名
  • 提取特定类型的代码行

2. 数据分析

  • CSV 文件的列提取和筛选
  • 日志文件的错误统计
  • 配置文件的格式化

3. 文档处理

  • 目录结构的整理
  • 文本内容的格式转换
  • 多语言文本的编码处理

注意事项

  1. 数据安全:%! 会直接替换文件内容,使用前请确保有备份
  2. 命令验证:复杂命令建议先在小范围测试
  3. 字符编码:注意文件的字符编码兼容性
  4. 性能考虑:大文件处理时命令可能较慢
  5. 错误处理:如果外部命令失败,文件内容可能被清空

掌握 Vim 的外部命令集成功能,可以将 Vim 打造成一个强大的文本处理工作台,充分利用 Unix/Linux 系统的丰富工具链,大大提升文本处理效率。

http://www.xdnf.cn/news/13408.html

相关文章:

  • 主键(PRIMARY KEY)与唯一键(UNIQUE KEY)的区别详解
  • 代码随想录算法训练营第60期第六十四天打卡
  • Maven 多仓库配置及缓存清理实战分享
  • 反向工程与模型迁移:打造未来商品详情API的可持续创新体系
  • 工厂方法模式(Factory Method Pattern)
  • 一个完整的日志收集方案:Elasticsearch + Logstash + Kibana+Filebeat (三)
  • 通义灵码 AI IDE 上线!智能体+MCP 从手动调用工具过渡到“AI 主动调度资源”
  • 欧盟手机和平板电脑生态设计和能源标签法案解析
  • 零基础玩转物联网-串口转以太网模块如何快速实现与MQTT服务器通信
  • 【Elasticsearch】Elasticsearch 近实时高速查询原理
  • 0610_特性和反射_加密和解密_单例模式
  • Python爬虫基础之Selenium详解
  • 如何排查 Docker 容器资源占用过高的问题?
  • RabbitMq详解
  • 期权卖方是谁?
  • CVE-2024-23897源码分析与漏洞复现(Jenkins 任意文件读取)
  • Mybatisplus3.5.6,用String处理数据库列为JSONB字段
  • 配置Linux的网络为静态IP地址的一些方法
  • http协议同时传输文本和数据的新理解
  • 可编辑前端列表页面,让你的用户直接粘贴录入数据
  • pdf.js在iOS移动端分页加载优化方案(ios移动端反复刷新加载问题)
  • dedecms 织梦自定义表单留言增加ajax验证码功能
  • 传统影像的盲区:心血管疾病诊断的新突破与未来
  • H5流媒体播放器EasyPlayer.js对H.265编码MP4文件的播放支持应用方案
  • C++_核心编程_多态案例二-制作饮品
  • 【JVM】- 垃圾回收
  • 字符串方法_indexOf() +_trim()+_split()
  • 6.10 - 常用 SQL 语句以及知识点
  • 【threejs】每天一个小案例讲解:常见几何体
  • Android --- Handler的用法,子线程中怎么切线程进行更新UI