小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

神奇的VIM

 瞻云軒 2016-02-19

在 IBM Bluemix 云平臺(tái)上開(kāi)發(fā)并部署您的下一個(gè)應(yīng)用。

開(kāi)始您的試用

由于被廣泛移植,無(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è)常用的指令序列

  1. xp 左右交換光標(biāo)處兩字符的位置。
  2. ddp 上下交換光標(biāo)處兩行的位置。

回頁(yè)首

例二、重復(fù)輸入同一字符

有時(shí),我們可能想多次輸入同一字符,VIM的插入功能可以很好的完成這項(xiàng)工作

命令 80i=^ESC 一次可以輸入80個(gè)字符= ,當(dāng)然,80a=^ESC 也可以完成上述功能。

請(qǐng)注意:此處的^ESC表示鍵盤(pán)左上方上的ESC鍵。

回頁(yè)首

例三、將兩個(gè)文本數(shù)據(jù)文件按行逐條合并,并給出標(biāo)尺

數(shù)據(jù)文件1內(nèi)容如下:
1-----
2-----
3-----

數(shù)據(jù)文件2內(nèi)容如下:
1=====
2=====
3=====

要求的結(jié)果如下:
|--------1---------2---------3---------4---------5
1-----
1=====
|--------1---------2---------3---------4---------5
2-----
2=====
|--------1---------2---------3---------4---------5
3-----
3=====

也許您會(huì)說(shuō),這還不簡(jiǎn)單,無(wú)非是反復(fù)拷貝、粘貼,任何一款文本編輯器都能完成上述功能??墒牵绻@兩個(gè)文件都很大,每個(gè)文件都成千上萬(wàn)行,恐怕簡(jiǎn)單的拷貝、粘貼就難以勝任了。因此,我們所關(guān)心的,是找到一種行之有效的方法,把枯燥乏味的工作留給計(jì)算機(jī),我們只需發(fā)布指令。為達(dá)到此目的,請(qǐng)按以下步驟執(zhí)行:

㈠、將兩文件合并,結(jié)果如下
1-----
2-----
3-----
1=====
2=====
3=====

㈡、在兩文件頭尾相接的地方插入標(biāo)志行,用以區(qū)分兩個(gè)文件,本文采用的是一整行!字符
1-----
2-----
3-----
!!!!!!!!!!!!!!!!!!!!!!!!
1=====
2=====
3=====

㈢、在標(biāo)志行的下方輸入標(biāo)尺
1-----
2-----
3-----
!!!!!!!!!!!!!!!!!!!!!!!!
|--------1---------2---------3---------4---------5
1=====
2=====
3=====

㈣、執(zhí)行宏命令腳本merge_2r.vim,即在VIM編輯器中按如下鍵 :so merge_2r.vim 回車(chē)

㈤、按下鍵盤(pán)上的=鍵,執(zhí)行的結(jié)果如下
|--------1---------2---------3---------4---------5
1-----
1=====
|--------1---------2---------3---------4---------5
2-----
2=====
|--------1---------2---------3---------4---------5
3-----
3=====
|--------1---------2---------3---------4---------5
!!!!!!!!!!!!!!!!!!!!!!!!
|--------1---------2---------3---------4---------5

㈥、將最后三行刪除,即可得到我們需要的結(jié)果
|--------1---------2---------3---------4---------5
1-----
1=====
|--------1---------2---------3---------4---------5
2-----
2=====
|--------1---------2---------3---------4---------5
3-----
3=====

怎么樣,簡(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í)行:

  1. ma 將數(shù)據(jù)文件一的第一行標(biāo)記為a
    1-----
    2-----
    3-----
    !!!!!!!!!!!!!!!!!!!!!!!!
    |--------1---------2---------3---------4---------5
    1=====
    2=====
    3=====

  2. /!!!!!^M 找到標(biāo)志行,置為當(dāng)前行
    1-----
    2-----
    3-----
    !!!!!!!!!!!!!!!!!!!!!!!!
    |--------1---------2---------3---------4---------5
    1=====
    2=====
    3=====

  3. + 光標(biāo)下移一行,即把標(biāo)尺行置為當(dāng)前行
    1-----
    2-----
    3-----
    !!!!!!!!!!!!!!!!!!!!!!!!
    |--------1---------2---------3---------4---------5
    1=====
    2=====
    3=====

  4. :.co 'a-1^M 把標(biāo)尺行復(fù)制到標(biāo)記行(數(shù)據(jù)文件一的第一行)的上方
    |--------1---------2---------3---------4---------5
    1-----
    2-----
    3-----
    !!!!!!!!!!!!!!!!!!!!!!!!
    |--------1---------2---------3---------4---------5
    1=====
    2=====
    3=====

  5. /!!!!!^M 再次找到標(biāo)志行,置為當(dāng)前行
    |--------1---------2---------3---------4---------5
    1-----
    2-----
    3-----
    !!!!!!!!!!!!!!!!!!!!!!!!
    |--------1---------2---------3---------4---------5
    1=====
    2=====
    3=====

  6. 2+ 光標(biāo)下移2行,即數(shù)據(jù)文件二的第一行置為當(dāng)前行
    |--------1---------2---------3---------4---------5
    1-----
    2-----
    3-----
    !!!!!!!!!!!!!!!!!!!!!!!!
    |--------1---------2---------3---------4---------5
    1=====
    2=====
    3=====

  7. :.m'a^M 把數(shù)據(jù)文件二的第一行移至標(biāo)記行的下方
    |--------1---------2---------3---------4---------5
    1-----
    1=====
    2-----
    3-----
    !!!!!!!!!!!!!!!!!!!!!!!!
    |--------1---------2---------3---------4---------5
    2=====
    3=====

  8. + 光標(biāo)下移一行,即數(shù)據(jù)文件一的第二行置為當(dāng)前行
    |--------1---------2---------3---------4---------5
    1-----
    1=====
    2-----
    3-----
    !!!!!!!!!!!!!!!!!!!!!!!!
    |--------1---------2---------3---------4---------5
    2=====
    3=====

  9. = 這一步很關(guān)鍵,是典型的遞歸調(diào)用,重復(fù)完成以上步驟

回頁(yè)首

例四、在文件中置入行號(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í)例講解。

回頁(yè)首

例五、有一文件,包含某外企的中國(guó)員工的資料,首先是姓名,然后是兩個(gè)空格,其次是15位身份證號(hào)碼。

zhang.fei  430759701022003
diao.chan  651302801225012
guan.yu  342869680413001
xi.shi  120638780214006
liu.bei  210324650708001

現(xiàn)在,有以下問(wèn)題需要解決:

  1. 按照外國(guó)人的習(xí)慣,應(yīng)該是名在前,姓在后。因此,文件中的姓名字段需要修改。
  2. 姓與名的首字母應(yīng)該大寫(xiě)。
  3. 根據(jù)身份證號(hào)碼,還可以判斷出生年月日,將其作為一個(gè)新字段添加。
  4. 根據(jù)身份證號(hào)碼,可以判斷出性別。若為男性,添加male,若為女性,添加female 。
  5. 將男女員工分開(kāi),男員工在前,女員工在后。
  6. 將各字段數(shù)據(jù)左對(duì)齊

最終結(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,$
. 與任意單字符(換行符除外)匹配,例如 y.s 可以匹配 yas y.s 或 y s 等等。
* 與前一字符的0次或多次出現(xiàn)匹配,例如 y*s 可以匹配 yys yyyyys 或 s 等等。
$ 與行尾匹配。
& 代表模式匹配中出現(xiàn)的字符串,例如 s/abc/&def 是把當(dāng)前行的abc替換成abcdef 。
[] 匹配[]中出現(xiàn)的字符,例如[abc]匹配字符 a,b 或 c ,[a-zA-Z]匹配所有的英文字符。
\( \) \(和\)之間出現(xiàn)的內(nèi)容可以由\num來(lái)替代。
\1\2\3 替代\(和\)之間出現(xiàn)的內(nèi)容。
\u 將后續(xù)字符串的首字母大寫(xiě)。
\{num} 與前一字符的num次出現(xiàn)匹配。

現(xiàn)在,我們對(duì)腳本逐條講解,希望能幫助大家理解正則文法。

⑴:%s/ / /
將文件中每行出現(xiàn)的2個(gè)空格替換為10個(gè)空格。

zhang.fei          430759701022003
diao.chan          651302801225012
guan.yu          342869680413001
xi.shi          120638780214006
liu.bei          210324650708001

⑵:%s/\(............\)\( *\)/\1/
保留行首的12個(gè)字符,將其余的空格刪除,這樣,前兩個(gè)字段就對(duì)齊了。

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/
將文件中每行出現(xiàn)的雇員姓名互換,并將首字母大寫(xiě)。

Fei.Zhang   430759701022003
Chan.Diao   651302801225012
Yu.Guan     342869680413001
Shi.Xi      120638780214006
Bei.Liu     210324650708001

⑷:%s/$/ xxxxxx/
在每一行的行尾添加2個(gè)空格和6個(gè)x

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/
將xxxxxx替換成出生年月日。

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
將年月日用/字符分隔,并在年前添加19。

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/
在每一行的行尾添加2個(gè)空格和6個(gè)x

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 /
身份證號(hào)碼末位是奇數(shù)的,將xxxxxx替換成male

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/
身份證號(hào)碼末位是偶數(shù)的,將xxxxxx替換成female

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最方便。

回頁(yè)首

例六、下列數(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)用。

開(kāi)始您的試用

由于被廣泛移植,無(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è)常用的指令序列

  1. xp 左右交換光標(biāo)處兩字符的位置。
  2. ddp 上下交換光標(biāo)處兩行的位置。

回頁(yè)首

例二、重復(fù)輸入同一字符

有時(shí),我們可能想多次輸入同一字符,VIM的插入功能可以很好的完成這項(xiàng)工作

命令 80i=^ESC 一次可以輸入80個(gè)字符= ,當(dāng)然,80a=^ESC 也可以完成上述功能。

請(qǐng)注意:此處的^ESC表示鍵盤(pán)左上方上的ESC鍵。

回頁(yè)首

例三、將兩個(gè)文本數(shù)據(jù)文件按行逐條合并,并給出標(biāo)尺

數(shù)據(jù)文件1內(nèi)容如下:
1-----
2-----
3-----

數(shù)據(jù)文件2內(nèi)容如下:
1=====
2=====
3=====

要求的結(jié)果如下:
|--------1---------2---------3---------4---------5
1-----
1=====
|--------1---------2---------3---------4---------5
2-----
2=====
|--------1---------2---------3---------4---------5
3-----
3=====

也許您會(huì)說(shuō),這還不簡(jiǎn)單,無(wú)非是反復(fù)拷貝、粘貼,任何一款文本編輯器都能完成上述功能。可是,如果這兩個(gè)文件都很大,每個(gè)文件都成千上萬(wàn)行,恐怕簡(jiǎn)單的拷貝、粘貼就難以勝任了。因此,我們所關(guān)心的,是找到一種行之有效的方法,把枯燥乏味的工作留給計(jì)算機(jī),我們只需發(fā)布指令。為達(dá)到此目的,請(qǐng)按以下步驟執(zhí)行:

㈠、將兩文件合并,結(jié)果如下
1-----
2-----
3-----
1=====
2=====
3=====

㈡、在兩文件頭尾相接的地方插入標(biāo)志行,用以區(qū)分兩個(gè)文件,本文采用的是一整行!字符
1-----
2-----
3-----
!!!!!!!!!!!!!!!!!!!!!!!!
1=====
2=====
3=====

㈢、在標(biāo)志行的下方輸入標(biāo)尺
1-----
2-----
3-----
!!!!!!!!!!!!!!!!!!!!!!!!
|--------1---------2---------3---------4---------5
1=====
2=====
3=====

㈣、執(zhí)行宏命令腳本merge_2r.vim,即在VIM編輯器中按如下鍵 :so merge_2r.vim 回車(chē)

㈤、按下鍵盤(pán)上的=鍵,執(zhí)行的結(jié)果如下
|--------1---------2---------3---------4---------5
1-----
1=====
|--------1---------2---------3---------4---------5
2-----
2=====
|--------1---------2---------3---------4---------5
3-----
3=====
|--------1---------2---------3---------4---------5
!!!!!!!!!!!!!!!!!!!!!!!!
|--------1---------2---------3---------4---------5

㈥、將最后三行刪除,即可得到我們需要的結(jié)果
|--------1---------2---------3---------4---------5
1-----
1=====
|--------1---------2---------3---------4---------5
2-----
2=====
|--------1---------2---------3---------4---------5
3-----
3=====

怎么樣,簡(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í)行:

  1. ma 將數(shù)據(jù)文件一的第一行標(biāo)記為a
    1-----
    2-----
    3-----
    !!!!!!!!!!!!!!!!!!!!!!!!
    |--------1---------2---------3---------4---------5
    1=====
    2=====
    3=====

  2. /!!!!!^M 找到標(biāo)志行,置為當(dāng)前行
    1-----
    2-----
    3-----
    !!!!!!!!!!!!!!!!!!!!!!!!
    |--------1---------2---------3---------4---------5
    1=====
    2=====
    3=====

  3. + 光標(biāo)下移一行,即把標(biāo)尺行置為當(dāng)前行
    1-----
    2-----
    3-----
    !!!!!!!!!!!!!!!!!!!!!!!!
    |--------1---------2---------3---------4---------5
    1=====
    2=====
    3=====

  4. :.co 'a-1^M 把標(biāo)尺行復(fù)制到標(biāo)記行(數(shù)據(jù)文件一的第一行)的上方
    |--------1---------2---------3---------4---------5
    1-----
    2-----
    3-----
    !!!!!!!!!!!!!!!!!!!!!!!!
    |--------1---------2---------3---------4---------5
    1=====
    2=====
    3=====

  5. /!!!!!^M 再次找到標(biāo)志行,置為當(dāng)前行
    |--------1---------2---------3---------4---------5
    1-----
    2-----
    3-----
    !!!!!!!!!!!!!!!!!!!!!!!!
    |--------1---------2---------3---------4---------5
    1=====
    2=====
    3=====

  6. 2+ 光標(biāo)下移2行,即數(shù)據(jù)文件二的第一行置為當(dāng)前行
    |--------1---------2---------3---------4---------5
    1-----
    2-----
    3-----
    !!!!!!!!!!!!!!!!!!!!!!!!
    |--------1---------2---------3---------4---------5
    1=====
    2=====
    3=====

  7. :.m'a^M 把數(shù)據(jù)文件二的第一行移至標(biāo)記行的下方
    |--------1---------2---------3---------4---------5
    1-----
    1=====
    2-----
    3-----
    !!!!!!!!!!!!!!!!!!!!!!!!
    |--------1---------2---------3---------4---------5
    2=====
    3=====

  8. + 光標(biāo)下移一行,即數(shù)據(jù)文件一的第二行置為當(dāng)前行
    |--------1---------2---------3---------4---------5
    1-----
    1=====
    2-----
    3-----
    !!!!!!!!!!!!!!!!!!!!!!!!
    |--------1---------2---------3---------4---------5
    2=====
    3=====

  9. = 這一步很關(guān)鍵,是典型的遞歸調(diào)用,重復(fù)完成以上步驟

回頁(yè)首

例四、在文件中置入行號(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í)例講解。

回頁(yè)首

例五、有一文件,包含某外企的中國(guó)員工的資料,首先是姓名,然后是兩個(gè)空格,其次是15位身份證號(hào)碼。

zhang.fei  430759701022003
diao.chan  651302801225012
guan.yu  342869680413001
xi.shi  120638780214006
liu.bei  210324650708001

現(xiàn)在,有以下問(wèn)題需要解決:

  1. 按照外國(guó)人的習(xí)慣,應(yīng)該是名在前,姓在后。因此,文件中的姓名字段需要修改。
  2. 姓與名的首字母應(yīng)該大寫(xiě)。
  3. 根據(jù)身份證號(hào)碼,還可以判斷出生年月日,將其作為一個(gè)新字段添加。
  4. 根據(jù)身份證號(hào)碼,可以判斷出性別。若為男性,添加male,若為女性,添加female 。
  5. 將男女員工分開(kāi),男員工在前,女員工在后。
  6. 將各字段數(shù)據(jù)左對(duì)齊

最終結(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,$
. 與任意單字符(換行符除外)匹配,例如 y.s 可以匹配 yas y.s 或 y s 等等。
* 與前一字符的0次或多次出現(xiàn)匹配,例如 y*s 可以匹配 yys yyyyys 或 s 等等。
$ 與行尾匹配。
& 代表模式匹配中出現(xiàn)的字符串,例如 s/abc/&def 是把當(dāng)前行的abc替換成abcdef 。
[] 匹配[]中出現(xiàn)的字符,例如[abc]匹配字符 a,b 或 c ,[a-zA-Z]匹配所有的英文字符。
\( \) \(和\)之間出現(xiàn)的內(nèi)容可以由\num來(lái)替代。
\1\2\3 替代\(和\)之間出現(xiàn)的內(nèi)容。
\u 將后續(xù)字符串的首字母大寫(xiě)。
\{num} 與前一字符的num次出現(xiàn)匹配。

現(xiàn)在,我們對(duì)腳本逐條講解,希望能幫助大家理解正則文法。

⑴:%s/ / /
將文件中每行出現(xiàn)的2個(gè)空格替換為10個(gè)空格。

zhang.fei          430759701022003
diao.chan          651302801225012
guan.yu          342869680413001
xi.shi          120638780214006
liu.bei          210324650708001

⑵:%s/\(............\)\( *\)/\1/
保留行首的12個(gè)字符,將其余的空格刪除,這樣,前兩個(gè)字段就對(duì)齊了。

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/
將文件中每行出現(xiàn)的雇員姓名互換,并將首字母大寫(xiě)。

Fei.Zhang   430759701022003
Chan.Diao   651302801225012
Yu.Guan     342869680413001
Shi.Xi      120638780214006
Bei.Liu     210324650708001

⑷:%s/$/ xxxxxx/
在每一行的行尾添加2個(gè)空格和6個(gè)x

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/
將xxxxxx替換成出生年月日。

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
將年月日用/字符分隔,并在年前添加19。

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/
在每一行的行尾添加2個(gè)空格和6個(gè)x

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 /
身份證號(hào)碼末位是奇數(shù)的,將xxxxxx替換成male

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/
身份證號(hào)碼末位是偶數(shù)的,將xxxxxx替換成female

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最方便。

回頁(yè)首

例六、下列數(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 版本

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶(hù)發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買(mǎi)等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶(hù) 評(píng)論公約

    類(lèi)似文章 更多