回忆上节课内容🤔
markdown变html
- 要把
markdown
文件中的 *斜体*
- 变成
html
中的 <em>斜体</em>
- 先写框架
s///gc
- 修改基本框架
-
s/\*.*\*//gc
- 匹配模式
- 先试一下,是否有高亮匹配
- 如果没有就
:se hls
原子化
- 仍然能够查找到
- 下面就是替换部分
-
:s/\*\(.*\)\*/<em>\1</em>/gc
-
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
- 如果要把
<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
多个参数
- 原来的列表
- 需要的列表
- 需要前后对调,还要去掉逗号
-
%s///gc
-
%s/.*,.*//gc
-
%s/(.*),(.*)//gc
-
%s/([^,]*),([^,]*)//gc
-
%s/\([^,]*\),\([^,]*\)//gc
- 转义
-
\([^,]*\),\([^,]*\)
原来的列表
-
([^,]*\)
前面的第一个原子,内容为除了逗号之外的字符
-
,
分隔符逗号
-
([^,]*\)
前面的第二个原子,内容为除了逗号之外的字符
- 高亮显示匹配的话
-
:%s/\([^,]*\),\([^,]*\)/\2 \1/gc
- 完成对调
如果是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
-
%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 时代的软件工程 -〔徐昊〕