Henry Henry
  • JavaScript
  • TypeScript
  • Vue
  • ElementUI
  • React
  • HTML
  • CSS
  • 技术文档
  • GitHub 技巧
  • Nodejs
  • Chrome
  • VSCode
  • Other
  • Mac
  • Windows
  • Linux
  • Vim
  • VSCode
  • Chrome
  • iTerm
  • Mac
  • Obsidian
  • lazygit
  • Vim 技巧
  • 分类
  • 标签
  • 归档
  • 网站
  • 资源
  • Vue 资源
GitHub (opens new window)

Henry

小学生中的前端大佬
  • JavaScript
  • TypeScript
  • Vue
  • ElementUI
  • React
  • HTML
  • CSS
  • 技术文档
  • GitHub 技巧
  • Nodejs
  • Chrome
  • VSCode
  • Other
  • Mac
  • Windows
  • Linux
  • Vim
  • VSCode
  • Chrome
  • iTerm
  • Mac
  • Obsidian
  • lazygit
  • Vim 技巧
  • 分类
  • 标签
  • 归档
  • 网站
  • 资源
  • Vue 资源
GitHub (opens new window)
  • 说明
  • Vim

  • VSCode

  • Chrome

  • iTerm

  • mac

  • Obsidian

  • lazygit

  • 学习双拼
  • Vim 技巧

    • Vim 技巧 - 说明
    • Vim 技巧 - 以退为进
    • Vim 技巧 - 点范式
    • Vim 技巧 - 把撤销单元切成块
    • Vim 技巧 - 构造可重复的修改
    • Vim 技巧 - 用次数做简单的算术运算
    • Vim 技巧 - 能够重复,就别用次数
    • Vim 技巧 - 在插入模式中可即时更正错误
    • Vim 技巧 - 结识插入 - 普通模式
    • Vim 技巧 - 不离开插入模式,粘贴寄存器中的文本
    • Vim 技巧 - 重复执行面向行的可视命令
    • Vim 技巧 - 只要可能,最好用操作符命令,而不是可视命令
    • Vim 技巧 - 结识 Vim 的命令行模式
    • Vim 技巧 - 在一行或多个连续行上执行命令
    • Vim 技巧 - 使用‘:t’和‘:m’命令复制和移动行
    • Vim 技巧 - 在指定范围上执行普通模式命令
    • Vim 技巧 - 重复上次的 Ex 命令
    • Vim 技巧 - 把当前单词插入到命令行
    • Vim 技巧 - 回溯历史命令
    • Vim 技巧 - 运行 Shell 命令
    • Vim 技巧 - 将工作区切分成窗
    • Vim 技巧 - 区分实际行与屏幕行
    • Vim 技巧 - 通过查找进行移动
    • Vim 技巧 - 遍历改变列表
    • Vim 技巧 - 用无名寄存器实现删除、复制与粘贴操作
    • Vim 技巧 - 深入理解 Vim 寄存器
    • Vim 技巧 - 用寄存器中的内容替换高亮选区的文本
    • Vim 技巧 - 把寄存器的内容粘贴出来
    • Vim 技巧 - 宏的读取与执行
    • Vim 技巧 - 规范光标位置、直达目标以及中止宏
    • Vim 技巧 - 加次数回放宏
    • Vim 技巧 - 在连续的文本行上重复修改
    • Vim 技巧 - 给宏追加命令
    • Vim 技巧 - 编辑宏的内容
    • Vim 技巧 - 调整查找模式的大小写敏感性
    • Vim 技巧 - 查找使用 v 或 V 模式
    • Vim 技巧 - 界定单词的边界
    • Vim 技巧 - 转义问题字符
    • Vim 技巧 - 结识查找命令
    • Vim 技巧 - 在执行查找前预览第一处匹配
    • Vim 技巧 - 将光标偏移到查找匹配的结尾
    • Vim 技巧 - 利用查找历史,迭代完成复杂的模式
    • Vim 技巧 - 结识 substitute 命令
    • Vim 技巧 - 在文件范围内查找并替换每一处匹配
    • Vim 技巧 - 手动控制每一次替换操作
    • Vim 技巧 - 重用上次的查找模式
    • Vim 技巧 - 用寄存器的内容替换
    • Vim 技巧 - 重复上一次 substitute 命令
    • Vim 技巧 - 使用子匹配重排 CSV 文件的字段
    • Vim 技巧 - 自动补全整行文本
    • Vim 技巧 - 以 g 开头的命令
    • Vim 技巧 - 以 z 开头的命令
    • Vim 技巧-ctrl 命令
    • Vim 技巧
    • 每日一 Vim 笔记
  • 键盘侠
  • Vim 技巧
Henry
2022-10-12

Vim 技巧 - 在文件范围内查找并替换每一处匹配

在缺省情况下,substitute 命令仅仅作用于当前行,而且只会修改第一处匹配。因此,为了在整个文件的范围内修改每一处匹配,我们必须指定范围,并使用标志位 g。出于演示的目的,我们将使用以下文本:

 让我们试着将所有单词 going 替换为 rolling。

要使用 substitute 命令,最简单的方法就是为它提供待替换的模式{pattern}以及替换字符串{string}:



看看发生了什么。Vim 已经将第一处“going”替换成了“rolling”,但其他匹配的内容并没有发生改变。

要理解其中的原因,一种行之有效的方法就是将文件想象成二维平面,字符沿着 x 轴增加,而文本行则随着 y 轴向下增长。在缺省情况下,substitute 命令仅仅作用于当前行的第一处匹配。接下来看一看,如果要将替换范围扩大至由 x 与 y 轴所围的整个平面,我们都需要采取哪些措施。

为了使 substitute 命令作用于整个横轴,需要引入标志位 g。g 看似为全局之意(global),实则有误导之嫌。也许有人想借此标志位在整个文件范围内进行替换操作,但实际上,它仅表示“当前一整行范围”。如果你还记得我们在 Vim(及其家族)的词源中讨论过 Vim 直接继承自“行编辑器 ed”的话,这就能说得通了。

我们先按 u 键来撤销上次的修改,然后试着运行 substitute 命令的另一个版本。这一次,我们在命令的结尾附加标志位/g:

 这一次,所有出现在当前行的 going 都被改成 rolling 了,但在文件的其他位置,仍有一些匹配未被修改。我们怎样才能控制 substitute 命令在整个文件的纵轴上执行呢?

答案是设定一个范围。如果我们在 substitute 命令的开头加上前缀 %,它就会在文件的每一行上执行了:

 substitute 命令只是众多 Ex 命令中的一种而已,而对于所有的 Ex 命令,都可以用同样的方式为其指定一个执行范围。关于这一点,我们已在技巧 - 在一行或多个连续行上执行命令中做过深入的探讨,此处不再引申。

回顾一下,如果我们想在当前文件中查找并替换所有匹配,就必须明确地指示 substitute 命令要在整个 x 轴与 y 轴上执行,即凭借标志位 g 处理横轴字符的同时,使用地址符 % 处理纵轴的文本行。

在实际操作过程中,这些细枝末节往往让人顾此失彼。在后面的技巧中,我们将会见识几种用于重复 substitute 命令的技术。

编辑 (opens new window)
#Vim
上次更新: 5/27/2023, 1:02:05 PM
Vim 技巧 - 结识 substitute 命令
Vim 技巧 - 手动控制每一次替换操作

← Vim 技巧 - 结识 substitute 命令 Vim 技巧 - 手动控制每一次替换操作→

最近更新
01
version 1.15
07-01
02
version 1.14
06-27
03
version 1.13
06-27
更多文章>
Theme by Vdoing | Copyright © 2017-2023 HenryTSZ | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式