乐趣区

关于vim:oeasy教您玩转vim-55-参数替换

[Github 地址] (https://github.com/overmind19…)
[Gitee 地址] (https://gitee.com/overmind198…)
[蓝桥实验楼 邀请码 FJWYIMGB] (https://www.lanqiao.cn/course…)

查找细节

回顾上节课内容🤔

  • 进行了模式匹配批量替换的的操作
  • 替换单词

    • :%s/\<a.*d\>/oeasy/g
  • 转义字符

    • %s/^\/\/.*$/d
  • 删除空行

    • :g/^\s*$//d
  • 还有替换还有一些什么玩法吗?🤔

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

多个参数

  • 原来的列表

    • 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> 标签呢

  • 须要把<img src="http://oeasy.org/o.png" title="o" />

    • 替换为
  • 先尝试匹配
  • /<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
  • 咱们介绍一种更神奇的模式,可视化编辑模式🤔
  • 下次再说 👋
退出移动版