学习vi和vim编辑器(8):全局替换(1)
本章學習vi編輯器中的全局替換命令。通過全局替換命令,可以自動替換文件中所有出現過的某個單詞。全局替換一般會用到兩個ex命令:":g"(global),":s"(substitute)。
替換命令:
替換命令的語法如下: " :s/old/new/ ",該命令會將當前這一行中第一個出現的old模式替換為new。其中斜線用來分隔命令的各部分(如果斜線位于該命令的最后一個字符,則該斜線可以省略)。
" :s/old/new/g "會將當前這一行中的所有old模式替換為new。在s前面加上行地址,就可以指定替換命令將會影響的行范圍。例如 : " %s/old/new/g "就能將文件中所有的old模式替換為new,如下圖所示:該命令將文件中的所有line替換為file。
 
而以下命令只會將文件所有行中的第一個line替換為file:
 
確認替換:
在使用搜索和替換命令時,應該非常小心。可以在替換命令的結尾加上c選項(代表confirm),從而在每一次替換之前進行確認,如下圖所示:
 
此時輸入y(代表"yes")即可對當前匹配的到的字符串進行替換,而輸入n則不進行替換。
與上下文有關的替換:
有時,需要搜索一個模式,當找到包含該模式的某個行時,將該行中的另一個字符串進行替換。即搜索模式并不是需要被替換的字符串。此時可以通過如下命令實現 " :g/pattern/s/old/new/g "。其中第一個g代表對文件中的所有行起作用,而最后一個g代表將每行中的所有old都替換為new(如果沒有這個g,則只會對每一行中的第一個old進行替換),patten即為搜索模式。
如下圖所示:該命令將搜索所有包含" Line "模式的行,并將該行中的 "this "字符串替換為" that "。
 
當用于搜索的模式和用于替換的模式一樣時,就沒有必要重復輸入了。此時可以簡寫為 "?:g/string/s//new/g ",該命令和 ":%s/string/new/g"命令效果一樣。
模式匹配的規則:
除了可以搜索常量字符串,vi編輯器還可以搜索可變的模式,即正則表達式。正則表達式是一種將普通字符和特殊的元字符結合起來的表達式。
用在搜索模式中的元字符:
. (點號):匹配任何一個單一字符(除換行符外);
* :匹配0到無窮多個前一個字符,因此 ?.* 即可匹配出任何數量的任何字符;
^:當^出現在正則表達式的開頭時,代表后面的正則表達式內容必須出現在一行的開頭。如果^不是出現在正則表達式的開頭,則沒有特殊含義;
$:當$出現在正則表達式的結尾時,代表前面的正則表達式內容必須出現在一行的結尾。如果$不是出現在正則表達式的結尾時,則沒有特殊含義;
\ : 相當于轉義字符,將后面的特殊字符當成一般的字符。
[ ]:匹配出方括號里的任何一個字符。例如p[aeu]t 匹配中pat,pet,put。而且如果匹配目標為一個范圍的字符,則可用第一個字符加上連字符,再加上最后一個字符來表示。例如,[A-Z] 匹配出A到Z之間的大寫字母,[0-9]匹配出0到9內的任何數字。而且方括號內可以包含兩個以上的范圍,也可以混合使用范圍和單個字符。插入符號^作為方括號內的第一個字符時,表示匹配出任何一個不在方括號中字符范圍內的字符。
:會將 與 之間的模式保存到特殊的空間(稱為保留緩沖區)。這種方法可以保存任何一行中的9個模式。
\< \> ?會匹配出以某些字符開頭(\<)或結尾(\>)的單詞;
~:會匹配出上一次搜索時所使用的正則表達式。
POSIX方括號表達式:
方括號除了可以用于匹配出位于方括號內的任何一個字符,POSIX引進了另外的方法,用于比較非英文字母的字符。在POSIX標準中,方括號內的字符組稱為“方括號表達式”。方括號表達式中,除了可以有文字字符,還可以包括其它元素:字符類:POSIX字符類包括了用 [: 與 :] 括起來的關鍵字。
校對符號:校對符號是由多個字符組成的序列,但是必須被當成一個單位。并且使用 [. 與 .]括起所需字符。
等價類:等價類列出所有應該被當成相等的字符集合,用[=與=]括起來。
這三類都必須出現在方括號表達式中,例如 [[:alpha:]!] 匹配出任何一個字母字符或者感嘆號。具體的POSIX字符類型可以參看《vi和vim編輯器》第六章:全局替換。
用在替換字符串中的元字符:
當做全局替換時,前面提到的具有特殊意義的元字符只能用在命令的搜索部分,即第一部分。而在替換字符串部分,這些元字符可能就失去了特殊意義。例如下圖中的命令只會將A或B或C都替換為"[abc]",而不是相應的小寫字母。
 
但是在替換字符串中,仍然存在一些具有特殊意義的元字符。
\n:利用 與 存儲的第n個模式做文本替換;
\:和搜索模式中的 \ 字符含義相同,都是轉義字符,使后面的一個特殊字符變為普通字符,從而失去特殊含義;
&:當用在替換字符中,&會被替換為搜索模式匹配出的完整文本,這在避免重復輸入文本時很有用;
~:和搜索模式中的~元字符意義類似,用來代表最后一個替換命令中的替換文本。這在重復編輯時很有用;
\u或\l:使替換字符串中的下一個字符變成大寫或小寫;
\U或\L或\e或\E:\U或\L會使后面的所有字符都被轉化成大寫或小寫的,直到出現\e或\E為止。
更多替換技巧:
:s:等同于 :s//~/,即會重復上一次替換;
:& : 也能重復上一個替換,可以把&想象成" 同樣的東西 ";
:~ :與:&命令類似,但是用來搜索的模式是上一個出現的正則表達式,而不是上一個替換命令中使用的正則表達式。
除了使用 / 字符作為替換命令中的分隔符,還可以使用任何非字母,非數值,非空格的字符,但是反斜線,雙引號,和豎線除外,這在對路徑字符串做替換時非常有用。
 
本章vi命令總結:
:s/old/new,g選項,c選項,:g,?搜索模式中的特殊字符 ?., *, ^, $, [], , \<, \>, ~,?
替換模式中的特殊字符 \n,\, &,~, \u, \l,\U,\L, \e,\E,
:s, :&, :~。
總結
以上是生活随笔為你收集整理的学习vi和vim编辑器(8):全局替换(1)的全部內容,希望文章能夠幫你解決所遇到的問題。
                            
                        - 上一篇: 在cmd命令行下编译运行C/C++源文件
 - 下一篇: 小心使用STL中map的[]操作符