oeasy教您玩轉(zhuǎn)vim - 55 - # 參數(shù)替換
[Github地址] (https://github.com/overmind1980/oeasyvim)
[Gitee地址] (https://gitee.com/overmind1980/oeasyvim)
[藍(lán)橋?qū)嶒?yàn)樓 邀請碼FJWYIMGB] (https://www.lanqiao.cn/courses/2840)
查找細(xì)節(jié)
回憶上節(jié)課內(nèi)容??
進(jìn)行了模式匹配批量替換的的操作
替換單詞
:%s/\<a.*d\>/oeasy/g
轉(zhuǎn)義字符
%s/^\/\/.*$/d
刪除空行
:g/^\s*$//d
還有替換還有一些什么玩法嗎???
markdown變html
要把
markdown
文件中的*斜體*
變成
html
中的<em>斜體</em>
先寫框架
s///gc
修改基本框架
s/\*.*\*//gc
匹配模式
先試一下,是否有高亮匹配
如果沒有就
:se hls

原子化
s/\*\(.*\)\*//gc
將其明確
將其原子化
給待替換部分加上括號
給括號轉(zhuǎn)義
看是否能匹配

仍然能夠查找到
下面就是替換部分
s/\*(.*)\*/<em>\1</em>/gc
\1
就是括號中的原子內(nèi)容把待替換模式放上去
s/\*(.*)\*/<em>\1<\/em>/gc
將需要轉(zhuǎn)義的內(nèi)容轉(zhuǎn)義
回車,替換成功!
使用參數(shù)
還是把html文件轉(zhuǎn)化為md文件
我需要把
<h1>
替換為- 空格
先搜索
/<h1>
,可以搜到,說明尖括號不用轉(zhuǎn)義再搜索
/<h1>.*</h1>
可以匹配
開始寫
:%s///gc
上框架
:%s/<h1>.*</h1>//gc
基礎(chǔ)內(nèi)容
:%s/<h1>(.*)</h1>//gc
加括號
:%s/<h1>\(.*\)<\/h1>//gc
轉(zhuǎn)義
:%s/<h1>\(.*\)</h1>/- \1/gc
\1
就是搜索中用轉(zhuǎn)義括號括起來的東西如果要把
<h2>
替換為? ? ? ?-
怎么辦?如何修改
:%s/<h2>\(.*\)</h2>/ ? ? ? ?- \1/g
多個(gè)參數(shù)
原來的列表
Joe,John
oeasy,oyeah
需要的列表
John Joe
oyeah oeasy
需要前后對調(diào),還要去掉逗號
%s///gc
:%s
在所有的范圍內(nèi)%s/.*,.*//gc
中間有逗號分開
%s/(.*),(.*)//gc
用括弧原子化
%s/([^,]*),([^,]*)//gc
括弧里的原子中不能有逗號
%s/\([^,]*\),\([^,]*\)//gc
([^,]*\)
前面的第一個(gè)原子,內(nèi)容為除了逗號之外的字符,
分隔符逗號([^,]*\)
前面的第二個(gè)原子,內(nèi)容為除了逗號之外的字符轉(zhuǎn)義
\([^,]*\),\([^,]*\)
原來的列表高亮顯示匹配的話
:%s/\([^,]*\),\([^,]*\)/\2 \1/gc
把原來的兩個(gè)原子前后對調(diào)
中間加上空格
\2 \1
完成對調(diào)
如果是a標(biāo)簽?zāi)兀?/h1><a href="http://oeasy.org">o</a>
變成[o](http://oeasy.org)
這里面需要兩個(gè)參數(shù)
鏈接網(wǎng)址http://oeasy.org
鏈接文本o
嘗試搜索
/<a href=.*>.*</a>
可以搜素到
/<a href=".*">.*</a>
不可以搜素到,說明"
需要轉(zhuǎn)義
給/<a href="(.*)">(.*)</a>
把括號、斜杠、引號前面加上轉(zhuǎn)義字符\
/<a href=\"\(.*\)\">\(.*\)<\/a>
然后寫批量替換
:%s///gc
框架
%s/<a href=\".*\">//gc
%s/<a href=\".*\">.*<\/a>//gc
有高亮匹配,證明模式ok
%s/<a href=\"(.*)\">(.*)<\/a>//gc
參數(shù)原子化
%s/<a href=\"\(.*\)\">\(.*\)<\/a>//gc
轉(zhuǎn)義
%s/<a href=\"\(.*\)\">\(.*\)<\/a>/[\2]\1/gc
\1
對應(yīng)第1
個(gè)字符里面匹配的東西
\2
對應(yīng)第2
個(gè)字符里面匹配的東西
然后就可以進(jìn)行批量替換了
問題
<a href="http://oeasy.org">o</a>asdf<a href="http://oeasy.org">o</a>
這句話有兩個(gè)超鏈接
但是替換之后
卻變成了一個(gè)超鏈接
這怎么辦?
貪婪匹配與非貪婪匹配
.*
對應(yīng)的是貪婪匹配 greedy
.{-}
對應(yīng)的是非貪婪匹配 non-greedy
會匹配第一個(gè)符合條件的
什么是貪婪匹配?
貪婪匹配
把 md
中的**重點(diǎn)文字**和**重點(diǎn)**
變成 html
中的 <strong>重點(diǎn)文字</strong>
注意他把這兩個(gè)分開了
\*\*.\{-}\*\*
\*\*
代表前兩個(gè)星號
.
的數(shù)量是\{-}
\*\*
代表后兩個(gè)星號
.
的數(shù)量是\{-}

根據(jù)這個(gè)我們來寫替換語句
:s///gc
:s/**(.*)**//gc
給需要轉(zhuǎn)義的字符轉(zhuǎn)義
:s/\*\*\(.*\)\*\*//gc
思路就是把.*變成.\{-}
把貪婪變成非貪婪
:s/\*\*\(.\{-}\)\*\*//gc
把替換的元素放上
:s/\*\*(.\{-})\*\*/<strong>\1<\/strong>/gc
嘗試一下
根據(jù)這個(gè),是否能解決一行中有多個(gè)<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>標(biāo)簽?zāi)?/h1>需要把<img src="http://oeasy.org/o.png" title="o" />
替換為
先嘗試匹配
/<img src=\"\(.*\)\" title=\"\(.*\)\" \/>
也就是/<img src="(.*)" title=(.*)">
給引號、括號、斜杠都加上轉(zhuǎn)義/
匹配成功之后開始替換
:%s/<img src=\"\(.*\)\" title=\"\(.*\)\" \/>/[!\2]\1
如果一行有多個(gè)img怎么辦?
還得把貪婪的變成非貪婪的
總結(jié)
我們學(xué)習(xí)了關(guān)于模式匹配中使用參數(shù)
別著急
先列框架
在一步一步填充進(jìn)去皮肉
注意轉(zhuǎn)義
冷靜仔細(xì)
不斷看著高亮的反饋
單個(gè)參數(shù)
:%s/<h2>\(.*\)</h2>/ ? ? ? ?- \1/g
多個(gè)參數(shù)
:%s/<img src=\"\(.*\)\" title=\"\(.*\)\" \/>/[!\2]\1
非貪婪匹配
:%s/<a href=\"\(.\{-\})\">\(.\{-\}\)<\/a>/[\2]\1/g
我們介紹一種更神奇的模式,可視化編輯模式??
下次再說 *
<a href="http://oeasy.org">o</a>
變成[o](http://oeasy.org)
這里面需要兩個(gè)參數(shù)
鏈接網(wǎng)址
http://oeasy.org
鏈接文本o
嘗試搜索
/<a href=.*>.*</a>
可以搜素到/<a href=".*">.*</a>
不可以搜素到,說明"
需要轉(zhuǎn)義給
/<a href="(.*)">(.*)</a>
把括號、斜杠、引號前面加上轉(zhuǎn)義字符\
/<a href=\"\(.*\)\">\(.*\)<\/a>
然后寫批量替換
:%s///gc
框架
%s/<a href=\".*\">//gc
%s/<a href=\".*\">.*<\/a>//gc
有高亮匹配,證明模式ok
%s/<a href=\"(.*)\">(.*)<\/a>//gc
參數(shù)原子化
%s/<a href=\"\(.*\)\">\(.*\)<\/a>//gc
轉(zhuǎn)義
%s/<a href=\"\(.*\)\">\(.*\)<\/a>/[\2]\1/gc
\1
對應(yīng)第1
個(gè)字符里面匹配的東西\2
對應(yīng)第2
個(gè)字符里面匹配的東西然后就可以進(jìn)行批量替換了
<a href="http://oeasy.org">o</a>asdf<a href="http://oeasy.org">o</a>
這句話有兩個(gè)超鏈接
但是替換之后
卻變成了一個(gè)超鏈接
這怎么辦?
貪婪匹配與非貪婪匹配
.*
對應(yīng)的是貪婪匹配 greedy.{-}
對應(yīng)的是非貪婪匹配 non-greedy會匹配第一個(gè)符合條件的
什么是貪婪匹配?
把 md
中的**重點(diǎn)文字**和**重點(diǎn)**
變成 html
中的 <strong>重點(diǎn)文字</strong>
注意他把這兩個(gè)分開了
\*\*.\{-}\*\*
\*\*
代表前兩個(gè)星號.
的數(shù)量是\{-}
\*\*
代表后兩個(gè)星號
.
的數(shù)量是\{-}

根據(jù)這個(gè)我們來寫替換語句
:s///gc
:s/**(.*)**//gc
給需要轉(zhuǎn)義的字符轉(zhuǎn)義
:s/\*\*\(.*\)\*\*//gc
思路就是
把.*變成.\{-}
把貪婪變成非貪婪
:s/\*\*\(.\{-}\)\*\*//gc
把替換的元素放上
:s/\*\*(.\{-})\*\*/<strong>\1<\/strong>/gc
嘗試一下
根據(jù)這個(gè),是否能解決一行中有多個(gè)<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" />
替換為
先嘗試匹配
/<img src=\"\(.*\)\" title=\"\(.*\)\" \/>
也就是
/<img src="(.*)" title=(.*)">
給引號、括號、斜杠都加上轉(zhuǎn)義/
匹配成功之后開始替換
:%s/<img src=\"\(.*\)\" title=\"\(.*\)\" \/>/[!\2]\1
如果一行有多個(gè)img怎么辦?
還得把貪婪的變成非貪婪的
總結(jié)
我們學(xué)習(xí)了關(guān)于模式匹配中使用參數(shù)
別著急
先列框架
在一步一步填充進(jìn)去皮肉
注意轉(zhuǎn)義
冷靜仔細(xì)
不斷看著高亮的反饋
單個(gè)參數(shù)
:%s/<h2>\(.*\)</h2>/ ? ? ? ?- \1/g
多個(gè)參數(shù)
:%s/<img src=\"\(.*\)\" title=\"\(.*\)\" \/>/[!\2]\1
非貪婪匹配
:%s/<a href=\"\(.\{-\})\">\(.\{-\}\)<\/a>/[\2]\1/g
我們介紹一種更神奇的模式,可視化編輯模式??
下次再說 *