Vim 替换命令完整学习笔记

Vim 替换命令完整学习笔记

文章目录

  • [Vim 替换命令完整学习笔记](#Vim 替换命令完整学习笔记)
    • [1. 核心概念](#1. 核心概念)
    • [2. 替换命令基本语法](#2. 替换命令基本语法)
      • [2.1 基本格式](#2.1 基本格式)
      • [2.2 分隔符选择](#2.2 分隔符选择)
      • [2.3 范围指定](#2.3 范围指定)
    • [3. 替换标志详解](#3. 替换标志详解)
      • [3.1 基础标志](#3.1 基础标志)
      • [3.2 高级标志](#3.2 高级标志)
      • [3.3 标志组合](#3.3 标志组合)
    • [4. 正则表达式在替换中的应用](#4. 正则表达式在替换中的应用)
      • [4.1 基础正则表达式](#4.1 基础正则表达式)
      • [4.2 字符类和量词](#4.2 字符类和量词)
      • [4.3 分组和引用](#4.3 分组和引用)
    • [5. 实用替换场景](#5. 实用替换场景)
      • [5.1 文本清理](#5.1 文本清理)
      • [5.2 代码重构](#5.2 代码重构)
      • [5.3 格式转换](#5.3 格式转换)
      • [5.4 批量修改](#5.4 批量修改)
    • [6. 查找命令](#6. 查找命令)
      • [6.1 基础查找](#6.1 基础查找)
      • [6.2 高级查找技巧](#6.2 高级查找技巧)
    • [7. 命令速查表](#7. 命令速查表)
    • [8. 实用技巧和最佳实践](#8. 实用技巧和最佳实践)
    • [9. 学习建议](#9. 学习建议)

1. 核心概念

Vim 的替换命令是其最强大的功能之一,基于强大的正则表达式系统,可以进行精确的文本查找和替换操作。

核心特点:

  • 强大的正则表达式支持:支持复杂的模式匹配
  • 灵活的范围控制:可以指定替换的行范围
  • 多种替换模式:支持全局、确认、大小写敏感等多种模式
  • 自定义分隔符:避免与模式中的字符冲突

基本思路:

  • 精确定义要查找的模式
  • 指定替换的内容
  • 选择适当的替换标志
  • 确定操作范围

2. 替换命令基本语法

2.1 基本格式

vim 复制代码
:[range]s/{pattern}/{replacement}/{flags}

语法组成:

  • [range] - 操作范围(可选)
  • s - substitute 替换命令
  • {pattern} - 要查找的模式
  • {replacement} - 替换内容
  • {flags} - 替换标志(可选)

2.2 分隔符选择

vim 复制代码
" 标准分隔符
:%s/old/new/g

" 自定义分隔符(避免冲突)
:%s#old#new#g
:%s@old@new@g
:%s{old}{new}g
:%s|old|new|g

💡 分隔符选择原则 :当模式中包含 / 字符时,使用其他分隔符避免转义

2.3 范围指定

vim 复制代码
:s/old/new/g           " 当前行
:%s/old/new/g          " 全文件
:1,10s/old/new/g       " 第1-10行
:10,30s/old/new/g      " 第10-30行
:.,+5s/old/new/g       " 当前行及下5行
:.-2,.s/old/new/g      " 当前行前2行到当前行
:10,$s/old/new/g       " 第10行到文件末尾
:'<,'>s/old/new/g      " 可视选择的范围

3. 替换标志详解

3.1 基础标志

  • g - 全局替换(替换行内所有匹配)
  • c - 确认替换(每次替换前询问)
  • i - 忽略大小写
  • I - 大小写敏感(默认行为)

3.2 高级标志

  • n - 只统计匹配数量,不执行替换
  • p - 打印包含替换的行
  • l - 打印包含替换的行(显示特殊字符)
  • e - 忽略错误(找不到模式时不报错)

3.3 标志组合

vim 复制代码
:%s/pattern/replacement/gc    " 全局替换 + 确认
:%s/pattern/replacement/gi    " 全局替换 + 忽略大小写
:%s/pattern/replacement/gci   " 全局 + 确认 + 忽略大小写
:%s/pattern/replacement/gn    " 全局统计(不替换)

4. 正则表达式在替换中的应用

4.1 基础正则表达式

vim 复制代码
" 字符匹配
:%s/./X/g              " 任意字符替换为X
:%s/^/# /g             " 行首添加注释符
:%s/$/ END/g           " 行尾添加END

" 转义字符
:%s/\./DOT/g           " 字面意义的点号
:%s/\*/STAR/g          " 字面意义的星号
:%s/\\/BACKSLASH/g     " 反斜杠

4.2 字符类和量词

vim 复制代码
" 字符类
:%s/\d/N/g             " 数字替换为N
:%s/\w/C/g             " 字母数字替换为C
:%s/\s/ /g             " 空白字符规范化为空格
:%s/\D/X/g             " 非数字替换为X

" 量词
:%s/\d\+/NUM/g         " 一个或多个数字
:%s/\w*/WORD/g         " 零个或多个字母
:%s/\s\{2,}/  /g       " 多个空格替换为两个空格
:%s/\d\{4}/YEAR/g      " 恰好4个数字替换为YEAR

4.3 分组和引用

vim 复制代码
" 基础分组
:%s/\(abc\)\(def\)/\2\1/g              " 交换abc和def
:%s/\(\w\+\)\s\+\(\w\+\)/\2 \1/g       " 交换两个单词
:%s/\(\d\{4}\)-\(\d\{2}\)-\(\d\{2}\)/\3\/\2\/\1/g  " 日期格式转换

" 复杂分组
:%s/\(\w\+\)=\(\w\+\)/\1: "\2"/g       " key=value 转为 key: "value"
:%s/\(.*\):\(.*\)/\2 -> \1/g           " 冒号分隔格式转换

5. 实用替换场景

5.1 文本清理

vim 复制代码
" 删除行尾空白
:%s/\s*$//g
:%s#\s*$##g

" 删除空行
:%s/^$//g
:g/^$/d                " 更好的方法

" 规范化空白
:%s/\s\+/ /g           " 多个空格合并为一个
:%s/\t/    /g          " Tab替换为4个空格
:%s/\r//g              " 删除Windows换行符

5.2 代码重构

vim 复制代码
" 批量注释
:10,19s/^/# /g         " 添加井号注释
:%s/^/\/\/ /g          " 添加双斜杠注释
:%s/^/<!-- /g | %s/$/ -->/g  " HTML注释(需要两步)

" 取消注释
:%s/^# //g             " 删除井号注释
:%s/^\/\/ //g          " 删除双斜杠注释

" 变量重命名
:%s/\<oldVar\>/newVar/g        " 精确匹配变量名
:%s/\bfunction_old\b/function_new/g  " 函数名替换

" 字符串格式转换
:%s/'\([^']*\)'/"\1"/g         " 单引号转双引号
:%s/"\([^"]*\)"/'\1'/g         " 双引号转单引号

5.3 格式转换

vim 复制代码
" 数据格式转换
:%s/\(\w\+\),\(\w\+\)/\2 \1/g         " CSV列交换
:%s/\(\d\{4}\)-\(\d\{2}\)-\(\d\{2}\)/\2\/\3\/\1/g  " 日期格式

" HTML/XML处理
:%s/<[^>]*>//g         " 删除所有HTML标签
:%s/&lt;/</g           " HTML实体转换
:%s/&gt;/>/g
:%s/&amp;/\&/g

" URL处理
:%s/http:/https:/g     " HTTP转HTTPS
:%s/\(https\?:\/\/\)\([^\/]*\)/\2/g    " 提取域名

5.4 批量修改

vim 复制代码
" 版本号替换
:%s/BUFV[1-8]/BUFV12/g         " 范围替换
:%s/BUFV\(9\|1[0-6]\)/BUFV16/g " 复杂范围

" 文件路径处理
:%s/\\/\//g            " Windows路径转Unix
:%s/\/\//\\/g          " Unix路径转Windows

" 配置文件修改
:%s/^#\s*\(.*\)/\1/g   " 取消配置注释
:%s/=\s*\(.*\)/= "\1"/g  " 值加引号

6. 查找命令

6.1 基础查找

vim 复制代码
" 向前查找
/pattern               " 查找pattern
/140P7T\d\w*          " 查找以140P7T开头的特定模式
/\<word\>             " 精确匹配单词

" 向后查找
?pattern              " 向上查找pattern
?ERROR                " 向上查找ERROR

" 查找控制
n                     " 下一个匹配
N                     " 上一个匹配
*                     " 查找当前单词(向前)
#                     " 查找当前单词(向后)

6.2 高级查找技巧

vim 复制代码
" 大小写控制
/pattern\c            " 忽略大小写查找
/pattern\C            " 大小写敏感查找

" 增量查找
:set incsearch         " 启用增量查找
:set hlsearch          " 高亮搜索结果
:nohlsearch            " 清除高亮

" 查找历史
/<Up>                 " 查找历史上一个
/<Down>               " 查找历史下一个
q/                    " 打开查找历史窗口

7. 命令速查表

命令 作用描述 举例
基础替换
:%s/old/new/g 全文件替换所有old为new :%s/hello/hi/g
:10,19s/^/#/g 第10-19行行首添加# 批量注释代码
:%s/pattern//g 删除所有匹配的pattern :%s/ADRN.*//g
范围替换
:s/old/new/ 当前行第一个匹配 单行单次替换
:s/old/new/g 当前行所有匹配 单行全部替换
:1,$s/old/new/g 全文件替换 等同于:%s
:.,+5s/old/new/g 当前行及下5行 范围替换
正则表达式替换
:%s/\d\{4\}/YEAR/g 4位数字替换为YEAR :%s/2023/YEAR/g
:%s/BUFV[1-8]/BUFV12/g BUFV1-8替换为BUFV12 范围字符替换
`:%s/BUFV\(9 1[0-6])/BUFV16/g` 复杂范围替换
:%s/\(abc\)\(def\)/\2\1/g 分组交换 abcdef → defabc
文本清理
:%s/\s*$//g 删除行尾空白 清理多余空格
:%s#\s*$##g 删除行尾空白(#分隔符) 避免分隔符冲突
:%s/\s\+/ /g 多个空格合并为一个 规范化空白
:%s/\t/ /g Tab替换为4个空格 统一缩进格式
特殊位置操作
:%s/^/# /g 所有行首添加"# " 批量注释
:%s/$/ END/g 所有行尾添加" END" 批量添加后缀
:%s/$/\/CLK/g 行尾添加"/CLK" :%s/$/\/CLK/g
替换标志
:%s/old/new/gc 全局替换+确认 逐个确认替换
:%s/old/new/gi 全局替换+忽略大小写 不区分大小写
:%s/old/new/gn 统计匹配数量 只计数不替换
自定义分隔符
:%s#pattern#replacement#g 使用#作为分隔符 :%s#foo/bar#baz/qux#g
:%s@pattern@replacement@g 使用@作为分隔符 避免/字符冲突
:%s{pattern}{replacement}g 使用{}作为分隔符 处理复杂路径
查找命令
/pattern 向前查找 /140P7T\d\w*
?pattern 向后查找 ?ERROR
/pattern\c 忽略大小写查找 不区分大小写
* 查找当前单词 快速查找光标下单词
命令 作用描述 举例
:%s/ADRN.*//:%s#ADRN.*## 用于替换当前文件中所有行中以ADRN开头的部分。删除该部分及其后所有字符,直到行尾。#/都可以作为分隔符。 :%s/ADRN.*//:%s#ADRN.*##
:10,19s/^/#/g 在第 10 行到第 19 行的每行行首加上#,即添加注释符号,常用于注释代码。 :10,19s/^/#/g
/140P7T\d\w* 查找匹配140P7T后跟一个数字和后续字母数字组合的字符串。\d匹配数字,\w*匹配零个或多个字母或数字。 /140P7T\d\w*
`:%s/BUFV\(9 1[0-6])/BUFV16/g` 将文件中所有的BUFV9BUFV1后跟1到6的数字替换为BUFV16。通过正则表达式`\(9
:%s/BUFV[1-8]/BUFV12/g 将文件中所有的BUFV1BUFV8替换为BUFV12 :%s/BUFV[1-8]/BUFV12/g
:%s#\s*$##g 删除每行行尾的空格。 :%s#\s*$##g
:%s{模式}{替换内容} 替换整个文件中的模式,匹配到的内容被替换为指定的内容。 :%s/ADRN.*//
:10,19s{模式}{替换内容} 替换第 10 行到第 19 行范围内匹配的模式,替换为指定内容。 :10,19s/^/#/g
:%s{模式}{替换内容}{g} 替换整个文件中所有匹配模式的内容,不管它出现多少次。 :%s/BUFV[1-8]/BUFV12/g
:%s{模式}{替换内容}{c} 替换匹配模式的内容时,每次都会进行确认,适用于需要用户逐步确认的情况。 :%s/\d\{4\}/YEAR/g
:%s{模式}{替换内容}{i} 忽略大小写进行替换。 :%s/abc/XYZ/i
:%s{模式}{替换内容}{gc} 替换每个匹配的内容时要求确认(类似c选项),并且对所有匹配项执行全局替换。 :%s/\d\{4\}/YEAR/gc
:%s{.*\s$}{//} 删除每行末尾的空白字符(空格、Tab)。 :%s/\s*$//g
:/{模式}/ 查找下一个匹配模式的地方,并将光标移动到该位置。 /140P7T\d\w*
:?{模式}/ 查找上一个匹配模式的地方,并将光标移动到该位置。 ?ERROR
:%s{模式}{替换内容}{n} 查找并替换模式,返回替换的数量。 :%s/abc/def/n
:%s{\(模式\)}{替换内容}{g} 在替换过程中使用正则表达式组。括号用于分组匹配。 :%s/\(abc\)\(def\)/\2\1/g
:%s#模式#替换内容# 使用自定义的分隔符(如#)代替默认的/,通常用于避免分隔符与模式中的字符冲突。 :%s#foo/bar#baz/qux#
:%s{模式}{替换内容}{g}(不加g 替换每行中第一次匹配的模式。 :%s/foo/bar/
:%s{模式}{替换内容}{g}(加g 替换每行中所有匹配模式的内容。 :%s/\d\{4\}/YEAR/g
:%s{模式}{替换内容}(使用正则表达式) 使用正则表达式进行模式匹配并替换。 :%s/\d\{4\}/YEAR/g
:%s#$#/CLK# 使用#作为分隔符替换行尾的#CLK# :%s#$#/CLK#
:%s/$/\/CLK/ 使用默认分隔符/来替换每行行尾,添加\CLK :%s/$/\/CLK/

8. 实用技巧和最佳实践

替换策略

  1. 先查找后替换 :使用 /pattern 确认模式正确
  2. 小范围测试:先在小范围内测试复杂替换
  3. 使用确认模式 :重要替换使用 gc 标志逐个确认
  4. 备份重要数据:大批量替换前备份文件

正则表达式技巧

vim 复制代码
" 非贪婪匹配的模拟
:%s/.*\ze pattern/replacement/  " 使用\ze向前预查

" 条件替换
:%s/\(pattern1\)\|pattern2/\1FOUND/g  " 只替换pattern1

" 复杂分组
:%s/\v(\w+)\s*=\s*(\w+)/\1: "\2"/g   " 使用very magic模式

" 大小写转换
:%s/\<\w/\U&/g           " 单词首字母大写
:%s/.*/\U&/g             " 整行大写
:%s/.*/\L&/g             " 整行小写

高效工作流程

vim 复制代码
" 1. 设置搜索选项
:set hlsearch incsearch

" 2. 先查找确认
/your_pattern

" 3. 替换操作
:%s//replacement/gc

" 4. 清除高亮
:nohlsearch

常用配置

vim 复制代码
" .vimrc 中的实用配置
set hlsearch          " 高亮搜索结果
set incsearch         " 增量搜索
set ignorecase        " 默认忽略大小写
set smartcase         " 智能大小写(包含大写时敏感)

" 快捷键映射
nnoremap <leader>h :nohlsearch<CR>    " 快速清除高亮
nnoremap <leader>s :%s//gc<Left><Left><Left>  " 快速替换

复杂场景处理

vim 复制代码
" 多行模式匹配
:%s/pattern\_.*end_pattern/replacement/g

" 跨行替换
:%s/\n/,/g            " 换行符替换为逗号

" 条件替换
:g/condition/s/pattern/replacement/g  " 只在匹配行中替换

" 排除特定行
:g!/exclude_pattern/s/pattern/replacement/g

9. 学习建议

循序渐进的学习路径

  1. 第一阶段:掌握基础替换

    • 熟练使用 :%s/old/new/g 基本格式
    • 理解范围指定和基础标志
  2. 第二阶段:学习正则表达式

    • 掌握基础字符类 \d, \w, \s
    • 学习量词 *, +, {n,m}
  3. 第三阶段:高级正则应用

    • 理解分组和引用 \(pattern\), \1
    • 学习复杂模式匹配
  4. 第四阶段:实际场景应用

    • 在代码重构中使用替换
    • 处理数据格式转换任务

实践建议

  1. 创建测试文件:准备各种格式的文本进行练习
  2. 记录常用模式:建立个人的替换模式库
  3. 结合其他命令 :与 :g, :v 命令结合使用
  4. 学习vim正则:理解Vim正则与其他工具的差异

避免常见错误

  • 忘记使用 g 标志导致只替换第一个匹配
  • 分隔符与模式中的字符冲突
  • 不理解分组引用的编号
  • 在重要文件上直接执行复杂替换

进阶技巧

vim 复制代码
" 使用表达式寄存器
:%s/pattern/\=expression/g

" 函数调用替换
:%s/\(\w\+\)/\=toupper(submatch(1))/g

" 宏与替换结合
:let @a='替换命令序列'
:normal @a

📝 核心提示:Vim的替换命令是文本处理的利器,掌握好正则表达式和分组引用是关键。记住"先查找,后替换,多测试,备份文件"的安全原则!

相关推荐
Gsen281923 分钟前
AI大模型从0到1记录学习 大模型技术之机器学习 day27-day60
人工智能·学习·机器学习
Linux运维技术栈32 分钟前
Vim 命令大全:从入门到精通
linux·编辑器·vim
村头的猫38 分钟前
建站SEO优化之站点地图sitemap
前端·经验分享·笔记
c7_ln38 分钟前
Linux基本指令(包含vim,用户,文件等方面)超详细
linux·操作系统·vim
蜉蝣之翼❉43 分钟前
games101 hw1
笔记·图形渲染
晨曦backend1 小时前
Vim 撤销 / 重做 / 操作历史命令汇总
linux·编辑器·vim
晨曦backend1 小时前
Vim 插件管理:MiniBufExplorer 使用指南
linux·编辑器·vim
nenchoumi31191 小时前
UE5 学习系列(九)光照系统介绍
java·学习·ue5
梦境虽美,却不长1 小时前
数据结构 (树) 学习 2025年6月12日12:59:39
数据结构·学习·二叉树·霍夫曼树·非二叉树
码小文2 小时前
MCU、MPU、GPU、Soc、DSP、FPGA、CPLD……它们到底是什么?
笔记·单片机·嵌入式硬件·学习·ic常识