Vim 替换命令完整学习笔记

Vim 替换命令完整学习笔记

文章目录

  • Vim 替换命令完整学习笔记
    • 1. 核心概念
    • 2. 替换命令基本语法
      • 2.1 基本格式
      • 2.2 分隔符选择
      • 2.3 范围指定
    • 3. 替换标志详解
      • 3.1 基础标志
      • 3.2 高级标志
      • 3.3 标志组合
    • 4. 正则表达式在替换中的应用
      • 4.1 基础正则表达式
      • 4.2 字符类和量词
      • 4.3 分组和引用
    • 5. 实用替换场景
      • 5.1 文本清理
      • 5.2 代码重构
      • 5.3 格式转换
      • 5.4 批量修改
    • 6. 查找命令
      • 6.1 基础查找
      • 6.2 高级查找技巧
    • 7. 命令速查表
    • 8. 实用技巧和最佳实践
      • 替换策略
      • 正则表达式技巧
      • 高效工作流程
      • 常用配置
      • 复杂场景处理
    • 9. 学习建议
      • 循序渐进的学习路径
      • 实践建议
      • 避免常见错误
      • 进阶技巧


1. 核心概念

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

核心特点:

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

基本思路:

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

2. 替换命令基本语法

2.1 基本格式

:[range]s/{pattern}/{replacement}/{flags}

语法组成:

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

2.2 分隔符选择

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

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

2.3 范围指定

: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 标志组合

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

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

4.1 基础正则表达式

" 字符匹配
:%s/./X/g              " 任意字符替换为X
:%s/^/# /g             " 行首添加注释符
:%s/$/ END/g           " 行尾添加END" 转义字符
:%s/\./DOT/g           " 字面意义的点号
:%s/\*/STAR/g          " 字面意义的星号
:%s/\\/BACKSLASH/g     " 反斜杠

4.2 字符类和量词

" 字符类
:%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 分组和引用

" 基础分组
:%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 文本清理

" 删除行尾空白
:%s/\s*$//g
:%s#\s*$##g" 删除空行
:%s/^$//g
:g/^$/d                " 更好的方法" 规范化空白
:%s/\s\+/ /g           " 多个空格合并为一个
:%s/\t/    /g          " Tab替换为4个空格
:%s/\r//g              " 删除Windows换行符

5.2 代码重构

" 批量注释
: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 格式转换

" 数据格式转换
:%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 批量修改

" 版本号替换
:%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 基础查找

" 向前查找
/pattern               " 查找pattern
/140P7T\d\w*          " 查找以140P7T开头的特定模式
/\<word\>             " 精确匹配单词" 向后查找
?pattern              " 向上查找pattern
?ERROR                " 向上查找ERROR" 查找控制
n                     " 下一个匹配
N                     " 上一个匹配
*                     " 查找当前单词(向前)
#                     " 查找当前单词(向后)

6.2 高级查找技巧

" 大小写控制
/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/g4位数字替换为YEAR:%s/2023/YEAR/g
:%s/BUFV[1-8]/BUFV12/gBUFV1-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/ /gTab替换为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|1[0-6]\)指定要匹配的具体数字范围。:%s/BUFV\(9|1[0-6]\)/BUFV16/g
:%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. 备份重要数据:大批量替换前备份文件

正则表达式技巧

" 非贪婪匹配的模拟
:%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             " 整行小写

高效工作流程

" 1. 设置搜索选项
:set hlsearch incsearch" 2. 先查找确认
/your_pattern" 3. 替换操作
:%s//replacement/gc" 4. 清除高亮
:nohlsearch

常用配置

" .vimrc 中的实用配置
set hlsearch          " 高亮搜索结果
set incsearch         " 增量搜索
set ignorecase        " 默认忽略大小写
set smartcase         " 智能大小写(包含大写时敏感)" 快捷键映射
nnoremap <leader>h :nohlsearch<CR>    " 快速清除高亮
nnoremap <leader>s :%s//gc<Left><Left><Left>  " 快速替换

复杂场景处理

" 多行模式匹配
:%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 标志导致只替换第一个匹配
  • 分隔符与模式中的字符冲突
  • 不理解分组引用的编号
  • 在重要文件上直接执行复杂替换

进阶技巧

" 使用表达式寄存器
:%s/pattern/\=expression/g" 函数调用替换
:%s/\(\w\+\)/\=toupper(submatch(1))/g" 宏与替换结合
:let @a='替换命令序列'
:normal @a

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/pingmian/84576.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

@RequestBody和@ResponseBody注解的作用是什么

@RequestBody和@ResponseBody注解的作用是什么 文章目录 @RequestBody和@ResponseBody注解的作用是什么@RequestBody和@ResponseBody注解的作用是什么SpringMVC的请求与响应模型1. 请求的处理流程1.1 DispatcherServlet作为入口1.2 Handler处理器与Controller1.3 HandlerAdapte…

质因数分解_java

什么是质因数&#xff1f; 说的通俗一点就是&#xff0c;这个数既是因数&#xff0c;又是质数。但是1不是质因数(不是质数)。然后比如122*2*3&#xff0c;里边的2&#xff0c;3都是质数&#xff0c;并且也是12的因数&#xff0c;所以2、3就是12的质因数。 因为本人很菜&#xf…

SpringDoc集成到Springboot

1.Maven引入jar包 <dependency><groupId>org.springdoc</groupId><artifactId>springdoc-openapi-ui</artifactId><version>1.6.14</version> </dependency> 2.新建OpenApiConfig文件&#xff0c;代码如下 package com.elan…

Memory Repair (五)

Compression Algorithm and Fuse Box Organization 通常情况下&#xff0c;这部分信息对于实现BISR&#xff08;内置自修复&#xff09;并非必需&#xff0c;但对于诊断问题可能有所帮助。 Compression and Fuse Box Organization Overview BISR controller采用的压缩算法基于两…

双系统(win+linux)根目录扩容(不掉GPU驱动)

先看效果&#xff0c;原来的根目录仅50G&#xff0c;从/home节点分出扩容后变为250GB&#xff1b; 因为根分区是系统当前运行的文件系统&#xff0c;Linux系统启动后会锁定根分区&#xff0c;防止对其进行修改。这时使用系统内的工具&#xff08;如gparted&#xff09;调整根分…

oracle 23ai对象注释新特性ANNOTATIONS

我们知道以前数据库版本注释方式是用COMMENT&#xff0c;如下 COMMENT ON COLUMN 表名.字段名 IS 字段注释; oracle 23ai对象注释有新增了ANNOTATIONS&#xff0c;比如创建如下表&#xff1a; SQL> create table test.t_user( id number, name varchar(200) ANNOTATIONS …

VMware 虚拟机开机自启动配置指南

方法一&#xff1a;通过启动文件夹设置&#xff08;简单版&#xff09; 打开启动文件夹&#xff1a; 按下 Win R 快捷键输入 shell:startup 并回车 创建启动脚本&#xff1a; 在打开的文件夹中右键新建一个文本文件命名为 vm_start.bat输入以下内容&#xff1a; echo off &…

2025pmx文件怎么打开blender和虚幻

pmx文件怎么打开blender 前言 一坑接一坑。 意思很简单&#xff0c;就是给Blender、3dsmax装插件&#xff0c;然后就可以打开了。但是报错就要多走很多错路。 记录一下。 内容 参考文章&#xff1a;https://blog.csdn.net/c858845275/article/details/144180555 我的Ble…

Kotlin基础语法五

继承与重载的open关键字 KT所有的类&#xff0c;默认是final修饰的&#xff0c;不能被继承&#xff0c;和Java相反 open&#xff1a;移除final修饰 类型转换 open class Person2(private val name: String) {fun showName() "父类 的姓名是【$name】"// KT所有的…

MySQL数据库:关系型数据库的基石

文章目录 每日一句正能量前言一、MySQL简介&#xff08;一&#xff09;什么是MySQL&#xff1f;&#xff08;二&#xff09;MySQL的历史 二、MySQL的特点&#xff08;一&#xff09;开源与免费&#xff08;二&#xff09;高性能&#xff08;三&#xff09;跨平台支持&#xff0…

【kafka】Golang实现分布式Masscan任务调度系统

要求: 输出两个程序,一个命令行程序(命令行参数用flag)和一个服务端程序。 命令行程序支持通过命令行参数配置下发IP或IP段、端口、扫描带宽,然后将消息推送到kafka里面。 服务端程序: 从kafka消费者接收扫描任务信息通过调用masscan启动探测任务,获取进度和结果信息,…

ARM 和 x86_64是什么关系

什么是 ARM 和 x86_64&#xff1f; 它们都是 CPU 指令集架构&#xff08;ISA&#xff09; 指令集架构&#xff08;Instruction Set Architecture&#xff09;就是&#xff1a; CPU 能够理解和执行的“语言”和“命令格式”。 类比解释&#xff1a;指令集就像“语言” 类比对…

nginx配置中有无‘‘/’’的区别

在Nginx配置中&#xff0c;location指令末尾的斜杠/和proxy_pass目标地址末尾的斜杠/组合使用会产生显著差异。以下是四种组合的区别详解&#xff1a; ​​核心区别对比表​​ 配置方案匹配规则请求URI传递逻辑实际转发效果示例location /api/ proxy_pass ...701/仅匹配/api/…

系统安全之身份认证

本篇我们对常用的身份认证协议做简要的梳理&#xff0c;包括主流的 HTTP 相关认证协议以及证书密钥对、新兴的 WebAuthn 认证。 HTTP 协议认证 RFC 7235 中定义了 HTTP 协议的认证框架&#xff0c;要求在支持 HTTP 协议的服务器&#xff0c;如果访问服务的身份验证失败&#…

部署http服务

使用flask搭建一个http服务&#xff0c;能够通过本地的另外一个终端访问对应接口&#xff0c;拿到服务端的计算结果 服务端&#xff1a; 创建一个test_http_dtw.py并运行 from flask import Flask, request, jsonifyapp Flask(__name__)# 示例分析函数 def analysis(data):…

WLAN 技术指南:从入门到原理

文章目录 目录 文章目录 前言 一.WLAN 基本概念 有线侧组网概念 AP-AC 组网方式 AC 连接方式 CAPWAP 协议 无线侧组网概念 无线信道 ​编辑 BSS/SSID/BSSID ​编辑 VAP ESS 二.WLAN 组网架构 基本的 WLAN 组网架构 四.WLAN 工作原理 AP 上线 AP 获取 IP 地址阶段 CAP…

语言学习专用AI播放器推荐:LLPlayer

学语言&#xff0c;经常会看大量的比较优秀的视频材料&#xff0c;那么推荐一款语言学习利器&#xff0c;极大提高生产力。 LLPlayer 是一款专为语言学习者设计的独特视频播放器。 它具有许多重要功能&#xff0c;例如可同时显示文本字幕和位图字幕、使用 OpenAI Whisper 自动…

mysql 关联表查询,索引失效

来源表: ##示例 CREATE TABLE order_wide (order_id varchar(33) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT 订单ID,member_id int(11) DEFAULT NULL COMMENT 用户ID,content varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT 订单标签,PRIMARY KEY (order_…

Oracle DG库手动注册归档日志的两种方法

Oracle DG库手动注册归档日志的两种方法 注册单个归档日志文件注册多个归档日志文件有的时候由于网络或各种原因,Oracle DG库服务器上可能缺少部分归档日志文件,导致DG库的MRP进程一直处于WAIT_FOR_GAP状态。 此时我们可以手动从主库或其他DG拷贝归档日志到当前DG服务器,并…

中小型VUE3项目创建流程相关命令tips

开新项目因为距离上次初始化时间太过久远,忘记初始化命令的有多少? 不得已简要记录一下流程 1. 使用vite构建新项目 1.1 构建 npm create vite@latest my-vue-app --template vue1.2 安装依赖 npm install1.3 启动 npm run dev参考文档 2. 添加需要的插件 2.1 准备工作…