oeasy教您玩转vim - 55 - # 参数替换

[Github地址] (https://github.com/overmind1980/oeasyvim)
[Gitee地址] (overmind1980/oeasyvim)
[蓝桥实验楼 邀请码FJWYIMGB] (oeasy 教您零基础玩转编辑神器 Vim_Linux - 蓝桥云课)

查找细节

回忆上节课内容🤔

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

    • :%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
  • 我们介绍一种更神奇的模式,可视化编辑模式🤔
  • 下次再说 👋

posted on 2021-10-19 09:11  overmind1980  阅读(128)  评论(0编辑  收藏  举报