vi方面的内容不知道分類到哪裡好,就放到《Linux指令五分鐘系列》裡吧!
今天程式設計,關于棧的一個小例子,其間我需要把”S.”替換為”S->”(替換不包括雙引号)。
其實這個不難,不過我覺得應該總結一下vi裡的替換技術了,以備以後查閱。
1
所有替換方案都要在冒号“:”狀态下書寫。
2
如果想将abc替換為xyz,那麼就這樣
:s/abc/xyz/
不過要特别注意,這個替換隻局限于光标所在目前行,而且更糟糕的是它隻替換目前行的第一個比對項。
即,如果此行内容為I write abc, I read xyz and abc. 那麼替換後的結果為I write xyz, I read xyz and abc.
3
如果想将一行裡的所有比對都進行替換,那麼就這樣:
:s/abc/xyz/g
4
如果想将一行裡所有的”S.”替換為”S->”,那麼就這樣:
:s/S\./S->/g
例如,此行S.abc and S->bcd and S.aaa and S..abc為,替換後為S->abc and S->bcd and S->aaa and S->.abc
此處因為點号“.”為特殊比對符,是以如果想比對點号,就需要用\放在點号前面,表示取消點号的特殊意義。
5
如果要擴大替換範圍,則可以用行數來限制:
如果要替換全文的S.為S->,則:
:1,$s/S\./S->/g
可以看出在s前面加上m,n則表示行的範圍,1表示第一行,$表示最後一行。當然你完全可以指定其他行數。
此處,m或n可以用特殊符号”.”或”$”代表,”.”代表目前行,”$”代表最後一行
如果是确定為全文替換,那麼可以用%來代替1,$,即:%s/S\./S->/g
6
你可能會發現如果我要比對一個http://roclinux.cn/index.php會很麻煩阿
因為//符号和/符号都會把替換搞亂。此時,你完全可以用#或者其他任何符号來替換/,如s/abc/xyz/可以替換為s#abc#xyz#,或者
s!abc!xyz!都是可以的!這個是不是很神奇,如果你了解perl的話,你會發現更多非常非常靈活的技巧。呵呵
如此行内容為:http://roclinux.cn/index.php and http:/uuw/faf
使用如下替換指令(此處使用了#):
:s#http://roclinux\.cn/index\.php#http://www\.sohu\.com#
替換後為:http://www.sohu.com and http:/uuw/faf
7
如果我希望把具有日期格式(XXXX-XX-XX)的字元串兩側加上一對單引号,即2008-07-01變成’2008-07-01’,可以這樣做。
例如,原來檔案内容為:
aaa 2008-07-01 bbb
ccc 2008-07-12 aaa
使用如下替換指令:
:1,$s/\([0-9]\{4\}-[0-9]\{2\}-[0-9]\{2\}\)/’\1’/g
替換後為:
aaa ‘2008-07-01′ bbb
ccc ‘2008-07-12′ aaa
這個替換指令比較複雜,裡面有這幾個知識點:
第一個知識點:[0-9]表示0到9之間的任一個數字
第二個知識點:\{n\}表示将此符号前面的元素重複n遍,是以[0-9]\{4\}就表示一個四位數的數字
第三個知識點:如果在比對方案中用到了\(\)則表示要暫存這個比對内容,而\1就表示要替換為暫存的比對内容,你仔細看看我給出替換指令,就可以
懂了,我們比對的如果是2008-07-01,那麼加了括号後就會被暫存,而在後面的\1處就會被替換過來,外面再加一對引号,就OK了!
ps:進階替換還是建議看看perl駱駝書。