欢迎光临散文网 会员登陆 & 注册

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

2021-10-19 09:09 作者:oeasy  | 我要投稿

[Github地址] (https://github.com/overmind1980/oeasyvim)
[Gitee地址] (https://gitee.com/overmind1980/oeasyvim)
[蓝桥实验楼 邀请码FJWYIMGB] (https://www.lanqiao.cn/courses/2840)

查找细节

回忆上节课内容🤔

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

  • 替换单词

    • :%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

  • 我们介绍一种更神奇的模式,可视化编辑模式🤔

  • 下次再说 *


oeasy教您玩转vim - 55 - # 参数替换的评论 (共 条)

分享到微博请遵守国家法律