董洪蒙
Vim是Linux上著名的文本編輯器,他是早年的Vi編輯器的加強(qiáng)版。gVim是Vim的圖形前端,它是跨平臺(tái)的編輯器,基本上主流的操作系統(tǒng)上面都有它的版本。這個(gè)極具Unix特色和風(fēng)格的編輯器功能十分強(qiáng)大,在實(shí)際工作中,尤其是批量文本處理上有著令人倍感方便快捷的特性。
Vim的具體編輯操作功能這里不做詳述,筆者主要針對(duì)其強(qiáng)大的正則替換功能加以解析,如果運(yùn)用得當(dāng),將會(huì)在大批量文本處理時(shí)事半功倍,極大提高處理效率,這樣對(duì)程序員或網(wǎng)絡(luò)管理員而言,將會(huì)得到一件得心應(yīng)手的利器,在實(shí)際工作中有著非常重要的意義。下文講述以gVim for windows作為使用環(huán)境。
在非編輯狀態(tài)下,按下英文半角字符冒號(hào)即可進(jìn)入Vim命令模式,正則替換要在此模式下輸入特定指令加以執(zhí)行,如下:
:g/test string/s//replace test string/g
可見替換命令由/分隔的6小段組成,說明如下:
第1段,例中“g”,代表替換范圍為全部行,也可用“101,200”這樣的格式代表特定的行號(hào)范圍。
第2段,例中“test string”,搜索的字符串,可使用正則表達(dá)式,詳細(xì)的正則表達(dá)式這里不做詳述,只做一些常用功能的說明:^代表行首,$代表行尾,.代表任意字符,\s代表空白(空白包括空格、TAB)字符,\w代表字母字符,\d代表若干數(shù)字字符,.、\s、\w、\d的后面跟\+代表1或多個(gè)字符,跟*代表0或多字符(貪婪模式),跟\{-}代表非貪婪模式的*。另外在正則中還可以用\(\)進(jìn)行分組。
第3段,例中“s”,代表要替換,需后續(xù)段指明如何替換,如果不包含第3段及以后的段,就代表搜索指令,如果第3段為d,則為刪除,無需后續(xù)段。
第4段,例中為空,如果找到搜索串行后,要替換的不是搜索串,而是其它字符串,可在這里指定,一般除特殊情況不做指定。
第5段,例中“replace string”要替換的字符串,為空代表刪除,可以使用第2段中的分組編號(hào)\1,\2等,代表從搜索串中取特定組的字符串,組合到替換字符串中,最后用作替換的串。
第6段,例中“g”,代表找到搜索字符串所在行后,全行搜索進(jìn)行替換,如不加,則代表僅對(duì)本行進(jìn)行一次搜索替換。
下面試舉幾例,對(duì)其進(jìn)行說明。
例1,如下交換機(jī)配置vlan腳本:
vlan 1
vlan 2
vlan 3
…
實(shí)際工作中,vlan可能很多,有上千個(gè),現(xiàn)在要在每個(gè)vlan前加個(gè)no,如果每行手工粘貼是不現(xiàn)實(shí)的,在Vim中可用一個(gè)簡(jiǎn)單的正則替換瞬間完成:
:g/^vlan/s//no vlan/
第2段的^vlan,代表尋找每行起頭為vlan的所在行,第6段沒有加g,因?yàn)槲覀冎恍杼鎿Q每行起頭的vlan為no vlan。
例2,有很長(zhǎng)一段從設(shè)備上尋出的腳本,空格非常雜亂:
nfpp
log-buffer entries 1024
log-buffer logs 1 interval 300
ip-guard rate-limit per-src-ip 32
ip-guard attack-threshold per-src-ip 64
no arp-guard enable
arp-guard rate-limit per-src-ip 16
arp-guard rate-limit per-src-mac 16
…
同樣行數(shù)非常多,每行頭尾有很多多余的空白需刪除,手工不適合,用word替換也不行,因?yàn)樾兄虚g還有有意義的空格,用Vim如下處理:
:g/^\s*/s/// # 刪除行首雜亂空白
:g/\s*$/s/// # 刪除行尾雜亂空白
注意第5段替換字符串為空,即為刪除搜索到的字符串。
例3,有如下腳本:
ap-config 教A-103
ap-mac 5869.6c00.a0a3
ap-group jxl_a_1c
ap-config 教A-108
ap-mac 5869.6c00.a0f3
ap-group jxl_a_1c
ap-config 教A-203
sta-limit 256
ap-group jxl_a_2c
ap-config 教A-204
…
現(xiàn)在僅需要ap-config起頭的行,其余行要全部刪除,用Vim如下處理:
:g!/^ap-config/d
第1段g后的!代表要搜索那些非指定搜索字符串所在的行,這樣很快刪除了那些除ap-config起頭之外的所有行。
例4,有以下防火墻腳本:
security-access access_to_2 from zone_16 to default
security-access access_to_3 from zone_17 to default
security-access access_to_4 from zone_18 to default
security-access access_to_5 from zone_19 to default
...
如何將其變?yōu)槿缦滦问剑?/p>
security-access access_to_16 from zone_2 to default
security-access access_to_17 from zone_3 to default
security-access access_to_18 from zone_4 to default
security-access access_to_19 from zone_5 to default
…
前后數(shù)字對(duì)調(diào),這項(xiàng)具一定難度的操作,用Vim一樣很容易完成:
:g/\(\d\+\)\(.\{-}\)\(\d\+\)/s//\3\2\1/
這里用到\1,\2,\3搜索分組替換,并且用.\{-}代表非貪婪的.*任意字符搜索方式。
綜上,限于篇幅,這里雖然舉的例子都經(jīng)過簡(jiǎn)化,實(shí)際工作中,要比上述更復(fù)雜,且都很龐大,當(dāng)處理幾十行的文本,與處理上萬行的文本相比較時(shí),就更能體會(huì)的Vim正則替換的強(qiáng)大之處,極端情況下,它能幫助我們提高上百倍的工作效率,并非枉談。