Vim 参数替换详解

回忆上节课内容🤔

markdown变html

  • 要把 markdown 文件中的 *斜体*
  • 变成 html 中的 <em>斜体</em>
  • 先写框架
    • s///gc
    • 修改基本框架
    • s/\*.*\*//gc
    • 匹配模式
    • 先试一下,是否有高亮匹配
    • 如果没有就:se hls

图片描述

原子化

  • :s/\*\(.*\)\*//gc
    • 给待替换部分加上括号
      • 将其明确
      • 将其原子化
    • 给括号转义
    • 看是否能匹配

图片描述

  • 仍然能够查找到
  • 下面就是替换部分
  • :s/\*\(.*\)\*/<em>\1</em>/gc
    • \1就是括号中的原子内容
    • 把待替换模式放上去
  • s/\*\(.*\)\*/<em>\1<\/em>/gc
    • 将需要转义的内容转义
  • 回车,替换成功!

使用参数

  • 还是把html文件转化为md文件
  • 我需要把<h1>替换为- 空格
    • 先搜索/<h1>,可以搜到,说明尖括号不用转义
    • 再搜索/<h1>.*</h1>
    • 可以匹配
  • 开始写
  • :%s///gc
    • 上框架
  • :%s/<h1>.*</h1>//gc
    • 基础内容
  • :%s/<h1>(.*)</h1>//gc
    • 加括号
  • :%s/<h1>\(.*\)<\/h1>//gc
    • 转义
  • :%s/<h1>\(.*\)<\/h1>/- \1/gc
    • \1就是搜索中用转义括号括起来的东西
  • 如果要把<h2>替换为-怎么办?
  • 如何修改
    • :%s/<h2>\(.*\)<\/h2>/ - \1/g

替换空格

  • 在markdown文件中
  • 如果链接中有空格
  • 则链接失效
  • 我们需要把空格替换为%20

图片描述

  • 6,11s/\(\d\{5}-\d\{6}\) /\1%20/gc
    • 6,11s 在6-11行进行substitute替换
    • \(\d\{5}-\d\{6}\)
      • 前面五个数字
      • 横杠-
      • 后面六个数字
      • 空格
      • 括号把空格前面的数字和横杠原子化
    • \1%20
      • 把原子化内容放回来
      • 空格变成%20

多个参数

  • 原来的列表
    • Joe,John
    • oeasy,oyeah
  • 需要的列表
    • John Joe
    • oyeah oeasy
  • 需要前后对调,还要去掉逗号
  • %s///gc
    • :%s 在所有的范围内
  • %s/.*,.*//gc
    • 中间有逗号分开
  • %s/(.*),(.*)//gc
    • 用括弧原子化
  • %s/([^,]*),([^,]*)//gc
    • 括弧里的原子中不能有逗号
  • %s/\([^,]*\),\([^,]*\)//gc
    • 转义
    • \([^,]*\),\([^,]*\)原来的列表
      • ([^,]*\) 前面的第一个原子,内容为除了逗号之外的字符
      • , 分隔符逗号
      • ([^,]*\) 前面的第二个原子,内容为除了逗号之外的字符
  • 高亮显示匹配的话
  • :%s/\([^,]*\),\([^,]*\)/\2 \1/gc
    • \2 \1
      • 把原来的两个原子前后对调
      • 中间加上空格
  • 完成对调

如果是a标签呢?

  • <a href="http://oeasy.org">o</a>变成[o](http://oeasy.org)
  • 这里面需要两个参数
    • 链接网址http://oeasy.org
    • 链接文本o
  • 尝试搜索
    • /<a href=.*>.*</a> 不可以搜素到

图片描述

  • /<a href=".*">.*<\/a> 可以搜素到,说明/需要转义

图片描述

  • /<a href="(.*)">(.*)<\/a>把括号、斜杠、引号前面加上转义字符\
    • /<a href=\"\(.*\)\">\(.*\)<\/a>

图片描述

进行替换

  • 然后写批量替换
  • :%s///gc
    • 框架
  • %s/<a href=\".*\">//gc
  • %s/<a href=\".*\">.*<\/a>//gc
    • 有高亮匹配,证明模式ok
  • %s/<a href=\"(.*)\">(.*)<\/a>//gc
    • 参数原子化
  • %s/<a href=\"\(.*\)\">\(.*\)<\/a>//gc
    • 转义
  • %s/<a href=\"\(.*\)\">\(.*\)<\/a>/[\2](\1)/gc
    • \1对应第1个小括号里面匹配的东西
    • \2对应第2个小括号里面匹配的东西
    • 然后就可以进行批量替换了

问题

  • <a href="http://oeasy.org">o</a>asdf<a href="http://oeasy.org">o</a>
    • 这句话有两个超链接
    • 但是替换之后
    • 却变成了一个超链接
    • 这怎么办?
  • 贪婪匹配与非贪婪匹配
    • .*对应的是贪婪匹配 greedy
    • .{-}对应的是非贪婪匹配 non-greedy
    • 会匹配第一个符合条件的
  • 什么是贪婪匹配?

贪婪匹配

  • md 中的**重点文字**和**重点**
  • 变成 html 中的 <strong>重点文字</strong>
  • 注意他把这两个分开了
  • \*\*.\{-}\*\*
    • \*\* 代表前两个星号
    • . 的数量是\{-}
    • \*\*代表后两个星号
  • . 的数量是\{-}

图片描述

  • 根据这个我们来写替换语句
  • :s///gc
  • :s/**(.*)**//gc
    • 给需要转义的字符转义
  • :s/\*\*\(.*\)\*\*//gc
    • 思路就是把.*变成.\{-}
    • 把贪婪变成非贪婪
  • :s/\*\*\(.\{-}\)\*\*//gc
    • 把替换的元素放上
  • :s/\*\*(.\{-})\*\*/<strong>\1<\/strong>/gc
  • 尝试一下
  • 根据这个,是否能解决一行中有多个<a>元素的问题

匹配模式

  • :%s///g
  • :%s/<a href=\".*\">.*<\/a>//g
  • :%s/<a href=\"(.*)\">(.*)<\/a>//g
  • :%s/<a href=\"\(.*\)\">\(.*\)<\/a>//g
  • :%s/<a href=\"\(.\{-}\)\">\(.\{-}\)<\/a>//g
    • 这步就是把.*变成.\{-}
  • :%s/<a href=\"\(.\{-\})\">\(.\{-\}\)<\/a>/[\2]\1/g

如果是标签呢

  • 需要把<img src="http://oeasy.org/o.png" title="o" />替换为![o](http://oeasy.org/o.png)
  • 先尝试匹配
  • /<img src=\"\(.*\)\" title=\"\(.*\)\" \/>
  • 也就是/<img src="(.*)" title=(.*)">给引号、括号、斜杠都加上转义/
  • 匹配成功之后开始替换
  • :%s/<img src=\"\(.*\)\" title=\"\(.*\)\" \/>/[!\2]\1
  • 如果一行有多个img怎么办?
  • 还得把贪婪的变成非贪婪的

总结

  • 我们学习了关于模式匹配中使用参数
    • 别着急
    • 先列框架
    • 在一步一步填充进去皮肉
    • 注意转义
    • 冷静仔细
    • 不断看着高亮的反馈
  • 单个参数
    • :%s/<h2>\(.*\)<\/h2>/ - \1/g
  • 多个参数
    • :%s/<img src=\"\(.*\)\" title=\"\(.*\)\" \/>/[!\2]\1
  • 非贪婪匹配
    • :%s/<a href=\"\(.\{-\})\">\(.\{-\}\)<\/a>/[\2]\1/g
  • 我们介绍一种更神奇的模式,可视化编辑模式🤔
  • 下次再说 👋

教程来源于Github,感谢overmind1980大佬的无私奉献,致敬!

技术教程推荐

Kafka核心技术与实战 -〔胡夕〕

即时消息技术剖析与实战 -〔袁武林〕

性能测试实战30讲 -〔高楼〕

手把手教你玩音乐 -〔邓柯〕

高楼的性能工程实战课 -〔高楼〕

零基础入门Spark -〔吴磊〕

说透元宇宙 -〔方军〕

Serverless进阶实战课 -〔静远〕

徐昊 · AI 时代的软件工程 -〔徐昊〕