|
由于被廣泛移植,無(wú)論是PC機(jī)的DOS和WINDOWS,還是RISC/6000的AIX,乃至于IBM的大型機(jī)S/390,都能見(jiàn)到VIM的身影。然而,對(duì)于初學(xué)者,VIM的用戶(hù)界面與使用方法非常不符合常規(guī),甚至認(rèn)為它比較混亂,無(wú)所適從。事實(shí)上,VIM編輯器是專(zhuān)門(mén)為經(jīng)驗(yàn)豐富的用戶(hù)設(shè)計(jì)的,它的界面和使用方法提供了更快的速度和更強(qiáng)的功能。對(duì)于熟知它的用戶(hù),VIM的許多特性節(jié)省了時(shí)間和擊鍵次數(shù),并可以完成一些其他編輯器無(wú)法完成的功能。 學(xué)習(xí)的最好方法是實(shí)踐,唯有如此,才能真正掌握其中的精髓。文中列舉的實(shí)例,都是筆者在實(shí)際工作中遇到的,具有一定的代表性,請(qǐng)大家在閱讀的過(guò)程中仔細(xì)體會(huì)。 好了,現(xiàn)在讓我們共同暢游神奇的VIM的世界! 例一、兩個(gè)常用的指令序列
例二、重復(fù)輸入同一字符有時(shí),我們可能想多次輸入同一字符,VIM的插入功能可以很好的完成這項(xiàng)工作 命令 80i=^ESC 一次可以輸入80個(gè)字符= ,當(dāng)然,80a=^ESC 也可以完成上述功能。 請(qǐng)注意:此處的^ESC表示鍵盤(pán)左上方上的ESC鍵。 例三、將兩個(gè)文本數(shù)據(jù)文件按行逐條合并,并給出標(biāo)尺數(shù)據(jù)文件1內(nèi)容如下:
數(shù)據(jù)文件2內(nèi)容如下:
要求的結(jié)果如下:
也許您會(huì)說(shuō),這還不簡(jiǎn)單,無(wú)非是反復(fù)拷貝、粘貼,任何一款文本編輯器都能完成上述功能??墒牵绻@兩個(gè)文件都很大,每個(gè)文件都成千上萬(wàn)行,恐怕簡(jiǎn)單的拷貝、粘貼就難以勝任了。因此,我們所關(guān)心的,是找到一種行之有效的方法,把枯燥乏味的工作留給計(jì)算機(jī),我們只需發(fā)布指令。為達(dá)到此目的,請(qǐng)按以下步驟執(zhí)行: ㈠、將兩文件合并,結(jié)果如下
㈡、在兩文件頭尾相接的地方插入標(biāo)志行,用以區(qū)分兩個(gè)文件,本文采用的是一整行!字符
㈢、在標(biāo)志行的下方輸入標(biāo)尺
㈣、執(zhí)行宏命令腳本merge_2r.vim,即在VIM編輯器中按如下鍵 :so merge_2r.vim 回車(chē) ㈤、按下鍵盤(pán)上的=鍵,執(zhí)行的結(jié)果如下
㈥、將最后三行刪除,即可得到我們需要的結(jié)果
怎么樣,簡(jiǎn)單嗎?請(qǐng)大家自己實(shí)際嘗試一下。下面,我來(lái)詳細(xì)講解宏命令腳本merge_2r.vim 。 該腳本內(nèi)容如下: "-------------------------------------------------------------------- "Macro Function : Merge File1 And File2,Have Ruler in every record " Date : 2001/12/01 " Author : Yan Shi "-------------------------------------------------------------------- "1----- "2----- } Sample File1 "3----- "!!!!!!!!!!!!!!!!!!!!!!!! Flag Row "|--------1---------2---------3---------4---------5 Ruler "1===== "2===== } Sample File2 "3===== "-------------------------------------------------------------------- :1 :map = ma/!!!!!^M+:.co 'a-1^M/!!!!!^M2+:.m'a^M+= 前14行每行都以"開(kāi)始,表明該行是注釋行,實(shí)際并不執(zhí)行,只是方便讀者閱讀,只有最后兩行才是真正的代碼行。請(qǐng)注意:本例中的^M表示鍵盤(pán)上的回車(chē)鍵,并非^和M兩個(gè)字符。為了講述清楚,我把命令行分解開(kāi),逐一說(shuō)明。 首先將第一行置為當(dāng)前行,然后執(zhí)行map命令,將一大串VIM指令映像給字符=。這一大串VIM指令共分9步執(zhí)行:
例四、在文件中置入行號(hào)工作中,我們有時(shí)希望把行號(hào)置入文件中,而VIM提供的功能 :set nu 只能顯示行號(hào),不能編輯或?qū)⑵渲萌胛募?dāng)中,下面的宏命令腳本row_num.vim可以完成此項(xiàng)功能。 "------------------------------------------
"Macro Function : Source File Add Row_Num
" Date : 2001/12/01
" Author : Yan Shi
"------------------------------------------
:%s/^/^I/
:$
:let end=line(".")
:1
"------------------------------------------
:let num=1
:while num<=end
:let line=getline(".")
:let temp=substitute(line,$,num,"")
:call setline(".",temp)
:+
:let num=num+1
:endwhile
"------------------------------------------請(qǐng)注意:本例中的^I表示鍵盤(pán)上的TAB鍵,并非^和I兩個(gè)字符。下面,我針對(duì)該宏命令腳本逐一講解。 :%s/^/^I/ 每一行的行首添加一個(gè)TAB字符
:$ 到文件的末行
:let end=line(".") 末行的行號(hào) ==〉變量 END,函數(shù)line的功能是取得指定行的行號(hào),此處參數(shù)"."表示當(dāng)前行
:1 到文件的首行
"------------------------------------------
:let num=1 1 ==〉計(jì)數(shù)器
:while num<=end
:let line=getline(".") 取當(dāng)前行的內(nèi)容 ==〉變量 LINE
:let line=substitute(line,$,num,"") 在變量 LINE 的前面置入行號(hào)
:call setline(".",line) 將變量 LINE 的內(nèi)容寫(xiě)回當(dāng)前行
:+ 下移一行
:let num=num+1 計(jì)數(shù)器加一
:endwhile 循環(huán)執(zhí)行,直到文件結(jié)束
"------------------------------------------有關(guān)正則表達(dá)式的使用 UNIX/LINUX下的很多工具之所以強(qiáng)大、靈活,關(guān)鍵是因?yàn)橛辛苏齽t文法和元字符,這也是VIM乃至UNIX/LINUX系統(tǒng)的精華所在。正因?yàn)槭褂渺`活,因此掌握起來(lái)比較吃力,如果不是真正理解,實(shí)際運(yùn)用中會(huì)出現(xiàn)千奇百怪的錯(cuò)誤。因此,有必要對(duì)這部分知識(shí)多花些氣力。下面結(jié)合具體實(shí)例講解。 例五、有一文件,包含某外企的中國(guó)員工的資料,首先是姓名,然后是兩個(gè)空格,其次是15位身份證號(hào)碼。zhang.fei 430759701022003 diao.chan 651302801225012 guan.yu 342869680413001 xi.shi 120638780214006 liu.bei 210324650708001 現(xiàn)在,有以下問(wèn)題需要解決:
最終結(jié)果如下: Fei.Zhang 430759701022003 1970/10/22 male Yu.Guan 342869680413001 1968/04/13 male Bei.Liu 210324650708001 1965/07/08 male ----------------------------------------------- Chan.Diao 651302801225012 1980/12/25 female Shi.Xi 120638780214006 1978/02/14 female 為了完成上述功能,只需執(zhí)行腳本employee.vim ,使用方法為 :so employee.vim 回車(chē)即可。 腳本內(nèi)容如下: :%s/ / /
:%s/\(............\)\( *\)/\1/
:%s/\([A-Za-z][A-Za-z]*\)\(\.\)\([A-Za-z][A-Za-z]*\)/\u\3\2\u\1/
:%s/$/ xxxxxx/
:%s/\([0-9]\{6}\)\([0-9]\{6}\)\([0-9]\{3}\) \(xxxxxx\)/\1\2\3 \2/
:%s/\(..\)\(..\)\(..\)$/19\1\/\2\/\3
:%s/$/ xxxxxx/
:%s/\([0-9]\{14}[13579]\)\(.*\)\(xxxxxx\)/\1\2male /
:%s/\([0-9]\{14}[02468]\)\(.*\)\(xxxxxx\)/\1\2female/
:$
:s/.*/&^M-----------------------------------------------
:g/female/.m$在這個(gè)腳本中,使用了大量的正則表達(dá)式,這里僅對(duì)涉及到的正則表達(dá)式做一簡(jiǎn)要介紹。有關(guān)正則表達(dá)式的內(nèi)容相當(dāng)多,本文不可能占用大量篇幅敘述,請(qǐng)大家諒解。 % 地址范圍符號(hào),代表文件中的所有行,作用等同于地址范圍 1,$
現(xiàn)在,我們對(duì)腳本逐條講解,希望能幫助大家理解正則文法。 ⑴:%s/ / / zhang.fei 430759701022003 diao.chan 651302801225012 guan.yu 342869680413001 xi.shi 120638780214006 liu.bei 210324650708001 ⑵:%s/\(............\)\( *\)/\1/ zhang.fei 430759701022003 diao.chan 651302801225012 guan.yu 342869680413001 xi.shi 120638780214006 liu.bei 210324650708001 ⑶:%s/\([A-Za-z][A-Za-z]*\)\(\.\)\([A-Za-z][A-Za-z]*\)/\u\3\2\u\1/ Fei.Zhang 430759701022003 Chan.Diao 651302801225012 Yu.Guan 342869680413001 Shi.Xi 120638780214006 Bei.Liu 210324650708001 ⑷:%s/$/ xxxxxx/ Fei.Zhang 430759701022003 xxxxxx Chan.Diao 651302801225012 xxxxxx Yu.Guan 342869680413001 xxxxxx Shi.Xi 120638780214006 xxxxxx Bei.Liu 210324650708001 xxxxxx ⑸:%s/\([0-9]\{6}\)\([0-9]\{6}\)\([0-9]\{3}\) \(xxxxxx\)/\1\2\3 \2/ Fei.Zhang 430759701022003 701022 Chan.Diao 651302801225012 801225 Yu.Guan 342869680413001 680413 Shi.Xi 120638780214006 780214 Bei.Liu 210324650708001 650708 ⑹:%s/\(..\)\(..\)\(..\)$/19\1\/\2\/\3 Fei.Zhang 430759701022003 1970/10/22 Chan.Diao 651302801225012 1980/12/25 Yu.Guan 342869680413001 1968/04/13 Shi.Xi 120638780214006 1978/02/14 Bei.Liu 210324650708001 1965/07/08 ⑺:%s/$/ xxxxxx/ Fei.Zhang 430759701022003 1970/10/22 xxxxxx Chan.Diao 651302801225012 1980/12/25 xxxxxx Yu.Guan 342869680413001 1968/04/13 xxxxxx Shi.Xi 120638780214006 1978/02/14 xxxxxx Bei.Liu 210324650708001 1965/07/08 xxxxxx ⑻:%s/\([0-9]\{14}[13579]\)\(.*\)\(xxxxxx\)/\1\2male / Fei.Zhang 430759701022003 1970/10/22 male Chan.Diao 651302801225012 1980/12/25 xxxxxx Yu.Guan 342869680413001 1968/04/13 male Shi.Xi 120638780214006 1978/02/14 xxxxxx Bei.Liu 210324650708001 1965/07/08 male ⑼:%s/\([0-9]\{14}[02468]\)\(.*\)\(xxxxxx\)/\1\2female/ Fei.Zhang 430759701022003 1970/10/22 male Chan.Diao 651302801225012 1980/12/25 female Yu.Guan 342869680413001 1968/04/13 male Shi.Xi 120638780214006 1978/02/14 female Bei.Liu 210324650708001 1965/07/08 male ⑽:$ 到文件的最后一行 ⑾:s/.*/&^M----------------------------------------------- Fei.Zhang 430759701022003 1970/10/22 male Chan.Diao 651302801225012 1980/12/25 female Yu.Guan 342869680413001 1968/04/13 male Shi.Xi 120638780214006 1978/02/14 female Bei.Liu 210324650708001 1965/07/08 male ----------------------------------------------- ⑿:g/female/.m$ Fei.Zhang 430759701022003 1970/10/22 male Yu.Guan 342869680413001 1968/04/13 male Bei.Liu 210324650708001 1965/07/08 male ----------------------------------------------- Chan.Diao 651302801225012 1980/12/25 female Shi.Xi 120638780214006 1978/02/14 female 筆者目前正在為某外資公司從事大型機(jī)(IBM S/390)的軟件開(kāi)發(fā),一切工作都在TSO環(huán)境中進(jìn)行。為了對(duì)編寫(xiě)的程序進(jìn)行測(cè)試,必須準(zhǔn)備測(cè)試數(shù)據(jù)。有過(guò)大型機(jī)開(kāi)發(fā)經(jīng)驗(yàn)的人會(huì)知道,通過(guò)TSO,輸入字符型數(shù)據(jù)還可以,如果要輸入16進(jìn)制數(shù)據(jù),操作起來(lái)很麻煩。因?yàn)?6進(jìn)制數(shù)是縱向排列的,輸入時(shí)既不方便,又很容易錯(cuò)位。怎么解決呢?我嘗試了幾種辦法,實(shí)際證明,用VIM最方便。 例六、下列數(shù)據(jù) 1234567890ABCDEF ,將其變成 13579ACE 24680BDF 的形式,這樣,數(shù)據(jù)就可以很方便的粘貼到TSO環(huán)境中了。下面給出宏命令腳本change_d.vim "---------------------------------------------------- "Macro Function : Convert Char Arrange Direction " " Sample : 40 50 60 ==> 4 5 6 " 0 0 0 " Date : 2001/12/01 " Author : Yan Shi "---------------------------------------------------- :s/.*/&^M/ :1 :map = malx+$p-`al= 說(shuō)明如下: ⑴ :s/.*/&^M/ 在數(shù)據(jù)行下方添加一空行。 ⑵ :1 回到文件的首行的首字符。 ⑶ :map = malx+$p-`al= 將一大串VIM命令映像給字符= ① ma 將首字符標(biāo)記為a ② l 光標(biāo)右移一個(gè)字符 ③ x 刪除光標(biāo)處字符 ④ + 移至下一行 ⑤ $ 到行尾 ⑥ p 將刪除的字符粘貼 ⑦ - 回至上一行 ⑧ `a 返回到標(biāo)記字符處 ⑨ l 光標(biāo)右移一個(gè)字符 ⑩ = 遞歸調(diào)用,重復(fù)以上步驟,直到將該行所有的數(shù)據(jù)處理完。 上面的這幾個(gè)實(shí)例,展示了VIM強(qiáng)大的文本處理功能,但這遠(yuǎn)不能覆蓋其全貌。VIM的命令很多,而且使用靈活,需要狠下一番氣力才能熟練掌握。筆者年齡尚小,經(jīng)驗(yàn)還很欠缺,希望本文能夠起到拋磚引玉的作用。由于時(shí)間的原因,上述實(shí)例僅在DOS和WINDOWS環(huán)境下測(cè)試,沒(méi)有在其他系統(tǒng)下進(jìn)行進(jìn)一步的測(cè)試,希望各位同行、前輩不吝賜教,謝謝! ※ VIM 意為 VI Improved ,與VI99%向下兼容。而且,VIM提供了許多VI不具備的功能,內(nèi)置了諸多函數(shù),因此,建議有經(jīng)驗(yàn)的VI用戶(hù)對(duì)VIM有所了解,您會(huì)發(fā)現(xiàn),轉(zhuǎn)向VIM是明智之舉。欲查詢(xún)有關(guān)VIM的資料,請(qǐng)參考 http://www. 注:本文使用 VIM 6.0 版本 在 IBM Bluemix 云平臺(tái)上開(kāi)發(fā)并部署您的下一個(gè)應(yīng)用。 由于被廣泛移植,無(wú)論是PC機(jī)的DOS和WINDOWS,還是RISC/6000的AIX,乃至于IBM的大型機(jī)S/390,都能見(jiàn)到VIM的身影。然而,對(duì)于初學(xué)者,VIM的用戶(hù)界面與使用方法非常不符合常規(guī),甚至認(rèn)為它比較混亂,無(wú)所適從。事實(shí)上,VIM編輯器是專(zhuān)門(mén)為經(jīng)驗(yàn)豐富的用戶(hù)設(shè)計(jì)的,它的界面和使用方法提供了更快的速度和更強(qiáng)的功能。對(duì)于熟知它的用戶(hù),VIM的許多特性節(jié)省了時(shí)間和擊鍵次數(shù),并可以完成一些其他編輯器無(wú)法完成的功能。 學(xué)習(xí)的最好方法是實(shí)踐,唯有如此,才能真正掌握其中的精髓。文中列舉的實(shí)例,都是筆者在實(shí)際工作中遇到的,具有一定的代表性,請(qǐng)大家在閱讀的過(guò)程中仔細(xì)體會(huì)。 好了,現(xiàn)在讓我們共同暢游神奇的VIM的世界! 例一、兩個(gè)常用的指令序列
例二、重復(fù)輸入同一字符有時(shí),我們可能想多次輸入同一字符,VIM的插入功能可以很好的完成這項(xiàng)工作 命令 80i=^ESC 一次可以輸入80個(gè)字符= ,當(dāng)然,80a=^ESC 也可以完成上述功能。 請(qǐng)注意:此處的^ESC表示鍵盤(pán)左上方上的ESC鍵。 例三、將兩個(gè)文本數(shù)據(jù)文件按行逐條合并,并給出標(biāo)尺數(shù)據(jù)文件1內(nèi)容如下:
數(shù)據(jù)文件2內(nèi)容如下:
要求的結(jié)果如下:
也許您會(huì)說(shuō),這還不簡(jiǎn)單,無(wú)非是反復(fù)拷貝、粘貼,任何一款文本編輯器都能完成上述功能。可是,如果這兩個(gè)文件都很大,每個(gè)文件都成千上萬(wàn)行,恐怕簡(jiǎn)單的拷貝、粘貼就難以勝任了。因此,我們所關(guān)心的,是找到一種行之有效的方法,把枯燥乏味的工作留給計(jì)算機(jī),我們只需發(fā)布指令。為達(dá)到此目的,請(qǐng)按以下步驟執(zhí)行: ㈠、將兩文件合并,結(jié)果如下
㈡、在兩文件頭尾相接的地方插入標(biāo)志行,用以區(qū)分兩個(gè)文件,本文采用的是一整行!字符
㈢、在標(biāo)志行的下方輸入標(biāo)尺
㈣、執(zhí)行宏命令腳本merge_2r.vim,即在VIM編輯器中按如下鍵 :so merge_2r.vim 回車(chē) ㈤、按下鍵盤(pán)上的=鍵,執(zhí)行的結(jié)果如下
㈥、將最后三行刪除,即可得到我們需要的結(jié)果
怎么樣,簡(jiǎn)單嗎?請(qǐng)大家自己實(shí)際嘗試一下。下面,我來(lái)詳細(xì)講解宏命令腳本merge_2r.vim 。 該腳本內(nèi)容如下: "-------------------------------------------------------------------- "Macro Function : Merge File1 And File2,Have Ruler in every record " Date : 2001/12/01 " Author : Yan Shi "-------------------------------------------------------------------- "1----- "2----- } Sample File1 "3----- "!!!!!!!!!!!!!!!!!!!!!!!! Flag Row "|--------1---------2---------3---------4---------5 Ruler "1===== "2===== } Sample File2 "3===== "-------------------------------------------------------------------- :1 :map = ma/!!!!!^M+:.co 'a-1^M/!!!!!^M2+:.m'a^M+= 前14行每行都以"開(kāi)始,表明該行是注釋行,實(shí)際并不執(zhí)行,只是方便讀者閱讀,只有最后兩行才是真正的代碼行。請(qǐng)注意:本例中的^M表示鍵盤(pán)上的回車(chē)鍵,并非^和M兩個(gè)字符。為了講述清楚,我把命令行分解開(kāi),逐一說(shuō)明。 首先將第一行置為當(dāng)前行,然后執(zhí)行map命令,將一大串VIM指令映像給字符=。這一大串VIM指令共分9步執(zhí)行:
例四、在文件中置入行號(hào)工作中,我們有時(shí)希望把行號(hào)置入文件中,而VIM提供的功能 :set nu 只能顯示行號(hào),不能編輯或?qū)⑵渲萌胛募?dāng)中,下面的宏命令腳本row_num.vim可以完成此項(xiàng)功能。 "------------------------------------------
"Macro Function : Source File Add Row_Num
" Date : 2001/12/01
" Author : Yan Shi
"------------------------------------------
:%s/^/^I/
:$
:let end=line(".")
:1
"------------------------------------------
:let num=1
:while num<=end
:let line=getline(".")
:let temp=substitute(line,$,num,"")
:call setline(".",temp)
:+
:let num=num+1
:endwhile
"------------------------------------------請(qǐng)注意:本例中的^I表示鍵盤(pán)上的TAB鍵,并非^和I兩個(gè)字符。下面,我針對(duì)該宏命令腳本逐一講解。 :%s/^/^I/ 每一行的行首添加一個(gè)TAB字符
:$ 到文件的末行
:let end=line(".") 末行的行號(hào) ==〉變量 END,函數(shù)line的功能是取得指定行的行號(hào),此處參數(shù)"."表示當(dāng)前行
:1 到文件的首行
"------------------------------------------
:let num=1 1 ==〉計(jì)數(shù)器
:while num<=end
:let line=getline(".") 取當(dāng)前行的內(nèi)容 ==〉變量 LINE
:let line=substitute(line,$,num,"") 在變量 LINE 的前面置入行號(hào)
:call setline(".",line) 將變量 LINE 的內(nèi)容寫(xiě)回當(dāng)前行
:+ 下移一行
:let num=num+1 計(jì)數(shù)器加一
:endwhile 循環(huán)執(zhí)行,直到文件結(jié)束
"------------------------------------------有關(guān)正則表達(dá)式的使用 UNIX/LINUX下的很多工具之所以強(qiáng)大、靈活,關(guān)鍵是因?yàn)橛辛苏齽t文法和元字符,這也是VIM乃至UNIX/LINUX系統(tǒng)的精華所在。正因?yàn)槭褂渺`活,因此掌握起來(lái)比較吃力,如果不是真正理解,實(shí)際運(yùn)用中會(huì)出現(xiàn)千奇百怪的錯(cuò)誤。因此,有必要對(duì)這部分知識(shí)多花些氣力。下面結(jié)合具體實(shí)例講解。 例五、有一文件,包含某外企的中國(guó)員工的資料,首先是姓名,然后是兩個(gè)空格,其次是15位身份證號(hào)碼。zhang.fei 430759701022003 diao.chan 651302801225012 guan.yu 342869680413001 xi.shi 120638780214006 liu.bei 210324650708001 現(xiàn)在,有以下問(wèn)題需要解決:
最終結(jié)果如下: Fei.Zhang 430759701022003 1970/10/22 male Yu.Guan 342869680413001 1968/04/13 male Bei.Liu 210324650708001 1965/07/08 male ----------------------------------------------- Chan.Diao 651302801225012 1980/12/25 female Shi.Xi 120638780214006 1978/02/14 female 為了完成上述功能,只需執(zhí)行腳本employee.vim ,使用方法為 :so employee.vim 回車(chē)即可。 腳本內(nèi)容如下: :%s/ / /
:%s/\(............\)\( *\)/\1/
:%s/\([A-Za-z][A-Za-z]*\)\(\.\)\([A-Za-z][A-Za-z]*\)/\u\3\2\u\1/
:%s/$/ xxxxxx/
:%s/\([0-9]\{6}\)\([0-9]\{6}\)\([0-9]\{3}\) \(xxxxxx\)/\1\2\3 \2/
:%s/\(..\)\(..\)\(..\)$/19\1\/\2\/\3
:%s/$/ xxxxxx/
:%s/\([0-9]\{14}[13579]\)\(.*\)\(xxxxxx\)/\1\2male /
:%s/\([0-9]\{14}[02468]\)\(.*\)\(xxxxxx\)/\1\2female/
:$
:s/.*/&^M-----------------------------------------------
:g/female/.m$在這個(gè)腳本中,使用了大量的正則表達(dá)式,這里僅對(duì)涉及到的正則表達(dá)式做一簡(jiǎn)要介紹。有關(guān)正則表達(dá)式的內(nèi)容相當(dāng)多,本文不可能占用大量篇幅敘述,請(qǐng)大家諒解。 % 地址范圍符號(hào),代表文件中的所有行,作用等同于地址范圍 1,$
現(xiàn)在,我們對(duì)腳本逐條講解,希望能幫助大家理解正則文法。 ⑴:%s/ / / zhang.fei 430759701022003 diao.chan 651302801225012 guan.yu 342869680413001 xi.shi 120638780214006 liu.bei 210324650708001 ⑵:%s/\(............\)\( *\)/\1/ zhang.fei 430759701022003 diao.chan 651302801225012 guan.yu 342869680413001 xi.shi 120638780214006 liu.bei 210324650708001 ⑶:%s/\([A-Za-z][A-Za-z]*\)\(\.\)\([A-Za-z][A-Za-z]*\)/\u\3\2\u\1/ Fei.Zhang 430759701022003 Chan.Diao 651302801225012 Yu.Guan 342869680413001 Shi.Xi 120638780214006 Bei.Liu 210324650708001 ⑷:%s/$/ xxxxxx/ Fei.Zhang 430759701022003 xxxxxx Chan.Diao 651302801225012 xxxxxx Yu.Guan 342869680413001 xxxxxx Shi.Xi 120638780214006 xxxxxx Bei.Liu 210324650708001 xxxxxx ⑸:%s/\([0-9]\{6}\)\([0-9]\{6}\)\([0-9]\{3}\) \(xxxxxx\)/\1\2\3 \2/ Fei.Zhang 430759701022003 701022 Chan.Diao 651302801225012 801225 Yu.Guan 342869680413001 680413 Shi.Xi 120638780214006 780214 Bei.Liu 210324650708001 650708 ⑹:%s/\(..\)\(..\)\(..\)$/19\1\/\2\/\3 Fei.Zhang 430759701022003 1970/10/22 Chan.Diao 651302801225012 1980/12/25 Yu.Guan 342869680413001 1968/04/13 Shi.Xi 120638780214006 1978/02/14 Bei.Liu 210324650708001 1965/07/08 ⑺:%s/$/ xxxxxx/ Fei.Zhang 430759701022003 1970/10/22 xxxxxx Chan.Diao 651302801225012 1980/12/25 xxxxxx Yu.Guan 342869680413001 1968/04/13 xxxxxx Shi.Xi 120638780214006 1978/02/14 xxxxxx Bei.Liu 210324650708001 1965/07/08 xxxxxx ⑻:%s/\([0-9]\{14}[13579]\)\(.*\)\(xxxxxx\)/\1\2male / Fei.Zhang 430759701022003 1970/10/22 male Chan.Diao 651302801225012 1980/12/25 xxxxxx Yu.Guan 342869680413001 1968/04/13 male Shi.Xi 120638780214006 1978/02/14 xxxxxx Bei.Liu 210324650708001 1965/07/08 male ⑼:%s/\([0-9]\{14}[02468]\)\(.*\)\(xxxxxx\)/\1\2female/ Fei.Zhang 430759701022003 1970/10/22 male Chan.Diao 651302801225012 1980/12/25 female Yu.Guan 342869680413001 1968/04/13 male Shi.Xi 120638780214006 1978/02/14 female Bei.Liu 210324650708001 1965/07/08 male ⑽:$ 到文件的最后一行 ⑾:s/.*/&^M----------------------------------------------- Fei.Zhang 430759701022003 1970/10/22 male Chan.Diao 651302801225012 1980/12/25 female Yu.Guan 342869680413001 1968/04/13 male Shi.Xi 120638780214006 1978/02/14 female Bei.Liu 210324650708001 1965/07/08 male ----------------------------------------------- ⑿:g/female/.m$ Fei.Zhang 430759701022003 1970/10/22 male Yu.Guan 342869680413001 1968/04/13 male Bei.Liu 210324650708001 1965/07/08 male ----------------------------------------------- Chan.Diao 651302801225012 1980/12/25 female Shi.Xi 120638780214006 1978/02/14 female 筆者目前正在為某外資公司從事大型機(jī)(IBM S/390)的軟件開(kāi)發(fā),一切工作都在TSO環(huán)境中進(jìn)行。為了對(duì)編寫(xiě)的程序進(jìn)行測(cè)試,必須準(zhǔn)備測(cè)試數(shù)據(jù)。有過(guò)大型機(jī)開(kāi)發(fā)經(jīng)驗(yàn)的人會(huì)知道,通過(guò)TSO,輸入字符型數(shù)據(jù)還可以,如果要輸入16進(jìn)制數(shù)據(jù),操作起來(lái)很麻煩。因?yàn)?6進(jìn)制數(shù)是縱向排列的,輸入時(shí)既不方便,又很容易錯(cuò)位。怎么解決呢?我嘗試了幾種辦法,實(shí)際證明,用VIM最方便。 例六、下列數(shù)據(jù) 1234567890ABCDEF ,將其變成 13579ACE 24680BDF 的形式,這樣,數(shù)據(jù)就可以很方便的粘貼到TSO環(huán)境中了。下面給出宏命令腳本change_d.vim "---------------------------------------------------- "Macro Function : Convert Char Arrange Direction " " Sample : 40 50 60 ==> 4 5 6 " 0 0 0 " Date : 2001/12/01 " Author : Yan Shi "---------------------------------------------------- :s/.*/&^M/ :1 :map = malx+$p-`al= 說(shuō)明如下: ⑴ :s/.*/&^M/ 在數(shù)據(jù)行下方添加一空行。 ⑵ :1 回到文件的首行的首字符。 ⑶ :map = malx+$p-`al= 將一大串VIM命令映像給字符= ① ma 將首字符標(biāo)記為a ② l 光標(biāo)右移一個(gè)字符 ③ x 刪除光標(biāo)處字符 ④ + 移至下一行 ⑤ $ 到行尾 ⑥ p 將刪除的字符粘貼 ⑦ - 回至上一行 ⑧ `a 返回到標(biāo)記字符處 ⑨ l 光標(biāo)右移一個(gè)字符 ⑩ = 遞歸調(diào)用,重復(fù)以上步驟,直到將該行所有的數(shù)據(jù)處理完。 上面的這幾個(gè)實(shí)例,展示了VIM強(qiáng)大的文本處理功能,但這遠(yuǎn)不能覆蓋其全貌。VIM的命令很多,而且使用靈活,需要狠下一番氣力才能熟練掌握。筆者年齡尚小,經(jīng)驗(yàn)還很欠缺,希望本文能夠起到拋磚引玉的作用。由于時(shí)間的原因,上述實(shí)例僅在DOS和WINDOWS環(huán)境下測(cè)試,沒(méi)有在其他系統(tǒng)下進(jìn)行進(jìn)一步的測(cè)試,希望各位同行、前輩不吝賜教,謝謝! ※ VIM 意為 VI Improved ,與VI99%向下兼容。而且,VIM提供了許多VI不具備的功能,內(nèi)置了諸多函數(shù),因此,建議有經(jīng)驗(yàn)的VI用戶(hù)對(duì)VIM有所了解,您會(huì)發(fā)現(xiàn),轉(zhuǎn)向VIM是明智之舉。欲查詢(xún)有關(guān)VIM的資料,請(qǐng)參考 http://www. 注:本文使用 VIM 6.0 版本 |
|
|