天天看點

《vi中的替換藝術》-linux指令五分鐘系列之十一

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駱駝書。

繼續閱讀