在Vim替換命令一文介紹過歉甚,substitute
命令的語法格式為::[range]s[ubstitute]/{pattern}/{string}/[flags]
罗洗。
[flags]
表示可選的標志位,常用的包括 g
物独、c
、n
、e
等现斋。其中,標志位 g
使得 substitute
命令可以修改一行內(nèi)的所有匹配偎蘸,而不僅僅是第一處匹配庄蹋;標志位 c
可以確認或拒絕每一處修改;標志位 n
讓 Vim 不執(zhí)行替換操作迷雪,而只是統(tǒng)計和顯示本次 substitute 命令匹配的個數(shù)限书;標志位 e
專門用于屏蔽錯誤提示;標志位 &
用于指示 Vim 重用上一次 substitute 命令所用過的標志位章咧。
一倦西、Vim substitute命令的操作范圍
為了便于理解,可以將整個文件想象成一個二維平面慧邮,字符沿著 x 軸向右增加调限,而文本行則隨著 y 軸向下增長。缺省情況下误澳,substitute
命令僅僅作用于當前行耻矮,而且只會修改第一處匹配。
怎么才能將替換范圍擴大到由 x 與 y 軸所圍的整個平面忆谓?本文接下來以將下文中出現(xiàn)的所有單詞 going 都替換為 rolling 為例逐步進行說明裆装。
When the going gets tough, the tough get going.
If you are going through hell, keep going.
使用 substitute
命令,最簡單的方法就是為其提供待匹配的模式 {pattern}
以及替換字符串 {string}
倡缠。因此哨免,先嘗試在 Vim 命令行模式下執(zhí)行命令:
:s/going/rolling
執(zhí)行完上述命令后,可以發(fā)現(xiàn) Vim 已經(jīng)將第一處 going 替換成了 rolling昙沦,但是文中其他匹配的內(nèi)容并沒有發(fā)生替換琢唾。
為了使 substitute 命令作用于整個橫軸,需要使用標志位 g
盾饮。
g
看似為全局 (global) 的含義采桃,容易讓人誤以為 g
標志位是用于實現(xiàn)在整個文件范圍內(nèi)進行替換操作,但實際上丘损,g
僅表示當前一整行范圍普办。由于 Vim 直接繼承自 "行編輯器 ed",對于行編輯器而言徘钥,全局的范圍就是一行衔蹲,這就是 g
標志位命令的由來。
繼續(xù)嘗試在 Vim 命令行模式下執(zhí)行命令:
:s/going/rolling/g
執(zhí)行完該命令后呈础,發(fā)現(xiàn)所有出現(xiàn)在當前行的 going 都被替換成了 rolling 了舆驶,但除當前行外的文件其他位置橱健,仍然有一些匹配未被修改。
如何才能控制 substitute
命令在整個文件的縱軸上執(zhí)行呢贞远?
答案就是使用 subsititute
命令格式中的 [range]
來指定一個執(zhí)行范圍畴博。如果需要在整個文件的每一行都執(zhí)行替換命令,只需要在 substitute
命令的開頭加上前綴 %
蓝仲,關(guān)于 range
的具體使用俱病,推薦閱讀Vim操作范圍、文件范圍介紹袱结。
這次亮隙,嘗試在 Vim 命令行模式下執(zhí)行下述命令,發(fā)現(xiàn)確實把整個文件中的 going 單詞替換成了新單詞 rolling垢夹。
:%s/going/rolling/g
總結(jié)上述的內(nèi)容就是:如果想在當前文件中查找并替換部分匹配溢吻,就必須明確地指示 substitute
命令在整個 x 軸與 y 軸上執(zhí)行的具體范圍,即通過標志位 g
處理橫軸字符的同時果元,使用 range
指定處理縱軸的范圍促王。
二、手工控制每一次替換操作
有些時候而晒,在執(zhí)行具體的替換操作前蝇狼,可能需要先觀察該處匹配再決定是否需要進行替換。
例如倡怎,在某個文件中迅耘,假設(shè)單詞 going 一共出現(xiàn)了 10 次,出于具體語境需要监署,第 3 次出現(xiàn)的 going 并不應(yīng)該被替換成 rolling颤专,如果直接使用 :%s/going/rolling/g
則會把所有的 going 替換成 rolling,這顯然不符合要求钠乏。
為了完成上述的操作目的栖秕,需要使用用標志位 c
來控制 substitute
命令的行為,需要執(zhí)行的命令為:
:%s/going/rolling/gc
增加標志位 c
后晓避,Vim 會在替換每處匹配結(jié)果之前都提示 "替換為 rolling ?" 供操作者手工確認簇捍,可以按 y
鍵確認一次修改,也可以按 n
鍵够滑,跳過一次修改垦写。無論選擇哪種結(jié)果吕世,Vim 都會執(zhí)行輸入的決定并移動光標到下一匹配處再次進行提示彰触。
除了可以選 y
確認,選 n
跳過以外命辖,還可以鍵入 q
退出此次替換過程况毅,使用 a
指示 Vim 替換該處及該處后所有的匹配而無需再由人工確認分蓖,也可以使用 l
指示 Vim 替換當前處匹配后直接退出替換過程。
下表總結(jié)了針對 Vim 替換提示所給出的所有答案及用途尔许。
答案 | 用途 |
---|---|
y |
替換此處匹配 |
n |
忽略此處匹配 |
q |
退出替換過程 |
l |
替換此處匹配后退出 (l 表示 last) |
a |
替換此處與之后所有的匹配 (a 表示 all) |
<Ctrl-e> |
向上滾動屏幕 |
<Ctrl-y> |
向下滾動屏幕 |