oeasy教您玩转vim - 55 - # 参数替换
[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
我们介绍一种更神奇的模式,可视化编辑模式🤔
下次再说 *