學習vi和vim編輯器(9):全域替換(2)

來源:互聯網
上載者:User

學習vi和vim編輯器(9):全域替換(2)

上一篇文章已經學習了如何通過vi編輯器中" :s "命令進行全域替換,而且可以在替換命令中使用Regex以進行強大的模式比對。這一篇文章將學習模式比對的更多範例,以進一步熟悉Regex。

模式比對的範例:

(1)匹配一個完整的單詞:如所示,如果需要將文本裡所有的child單詞替換成為children,可能最先想到的就是所示的替換命令:

但是這個命令會把childrendish,Fabrichild這兩個單詞中的child都做替換,這不是我們想要的。替換的關鍵就是child要是一個單獨的單詞,可能又想到如下的方法:


該命令搜尋以空格,逗號,分號結尾的child,並將該child替換為children,同時保留原來child之後的符號。但是該命令仍然會失敗,因為Fabrichild也會被替換。

其實很簡單,結合\< 和\>就能匹配出一個單獨的完整的單詞,如下命令就能完成我們想要的替換工作:

(2)搜尋一般的單詞類:如所示,需要將mgibox,mgrbox,mgabox中的所有box替換成為square,可以採用如下方法:<喎?http://www.bkjia.com/kf/ware/vc/" target="_blank" class="keylink">vcD4KPHA+PGltZyBzcmM9"http://www.2cto.com/uploadfile/Collfiles/20141231/2014123110070846.png" alt="\">

這個命令中所用到的特殊元字元都在上一篇文章中做瞭解釋,這裡就不再一一解釋了。

(3)對檔案路徑做替換:如所示,需要將 /home/test/ 替換成為 /usr/local,由於" / "在替換命令中具有特殊含義(作為替換命令中各個部分的分隔字元),所以需要按照如下方式來進行替換:


但是上一篇文章中已經講過,除了使用" / "作為分隔字元,還可以使用其他字元作為分隔字元,如所示,採用" ; "作為替換命令中各個部分的分隔字元,可以使整個替換命令更簡潔:

(4)將第1至第10行之間的所有句號改為分號:" :1,10s/\./;/g ",因為" . "在替換字串中具有特殊含義,所以需要通過" \ "逸出字元將其轉化為普通的句號。

(5)將出現的help或Help轉化為HELP:" :%s/[hH]elp/\U&/g "。

(6)將一個或多個空格替換成一個空格: " :%s/ */ /g",注意搜尋模式中"*"前面是兩個空格,這樣才能匹配出一個或多個空格。

(7)刪除所有空白行:" :g/^$/d ","^$ "能夠匹配出中間沒有內容的行,即空白行。注意只包含空格或者tab鍵的行,雖然看上去是空白的,但是這個命令不會刪除這樣的行。如果需要刪除空白行(不包含任何內容的行)和所有只包括空格或tab鍵的行,可以通過如下命令:" :g/^[ tab]*$/d "。

(8)刪除每一行開頭的所有空格:" :%s/^ *\(.*\)/\1/ ",注意第一個"*"前面有兩個空格,這樣才能匹配出一個或多個空格。
(9)刪除每一行結尾的所有空格:" :%s/\(.*)\ *$/\1/",同樣注意最後一個"*"前面有兩個空格。

(10)在每一行的開頭加上"//":通過在每行的開頭加上"//",從而快速注釋一段代碼:


注意以上命令採用" ; "作為分隔字元,並且採用" . , +3"指定了注釋的範圍,即當前行及之後的3行代碼。其實還有一種更簡單的寫法:


這個命令將行開頭(^)替換成為"//","^"代表一行的開頭(這是一個邏輯上的概念,並不是實際的字元,因此實際的行首字元並不會真的被替換掉)。

(11)在檔案所有行末尾都加上句號:" :%s/$/./ "。

(12)逆轉所有用連字號分隔部分的順序:


(13)將檔案中的每一個單詞全變成大寫:" :%s/.*/\U&/ " 或者 " :%s/./\U&/g ",但是第一個命令會更快一些。

(14)逆轉檔案中的各行順序:" :g/.*/mo 0 "。該命令會按照檔案行的順序,依次將每一行移動到檔案的開頭,從而完成檔案行順序的逆轉。其中" .* "會匹配出完整的一行,mo是ex編輯器中的移動命令,可以參考《學習vi和vim編輯器(6):ex編輯器概述(1)》。或者也可以使用 " :g/^/mo 0 "。

(15)在所有不包含line單詞的行的末尾加上 end: " :g!/line/s/$/end/ "。要想影響除了匹配模式以外的所有行,可以直接在g命令後面加上驚嘆號,或者直接使用v命令,因此如下命令也可以實現: " :v/line/s/$/end/ "。

(16)將每行開頭的數字刪除:

用模式移動文字區塊:

正如之前所看到的,":g"命令可以和":d","mo",“co”等ex命令結合起來使用。同時可以使用模式作為分界的文字區塊。如所示,將 chapter one 的檔案內容移動到檔案末尾:


該命令搜尋chapter one所在的行(即第一章的標題列),並將該行及chapter two所在行的上一行之間的所有行(從而標記出了整個第一章的文字區塊)移動到檔案末尾。

模式比對最後的叮嚀:

(1)匹配任意數量的任一字元串時,Regex總是儘可能地匹配出最多的文本;

(2)當我們重新思考一個匹配模式時,通常比較好的方法是更精準地修改變數(元字元),而不是用特定的文字來限制模式。在模式中運用越多變數,命令的力量就越強大;

(3)有時精確地指定理想結果比起指定不要的結果困難的多。

用:g重複命令:

g命令可以選擇某些行,但是伴隨著的編輯命令卻不一定要要影響這些選擇的行。如所示,該命令能夠將檔案的第11到第12行複製到檔案末尾,並重複10次這樣的複製行為。


解釋一下該命令的工作行為:"1,10g"代表將在檔案的第1至第10行執行搜尋行為,由於搜尋模式只是一個"^",所以每一行都符合搜尋模式。當選中第一行時,執行後面的編輯命令,將檔案的第11至第12行複製到檔案結尾(該編輯命令與當前選中的第一行沒有關係),接著選中第二行時,再次執行後面的編輯命令,因此將總共執行10次編輯命令,從而達到用:g來重複命令的效果。

收集行:

如所示,在一個源檔案中,如果要根據所有函數的定義,直接抽出函數原型並匯入到一個標頭檔中,可以通過如下命令實現:

該命令的工作行為:首先對整個檔案進行逐行搜尋,搜尋出每一個以"{"開頭的行,將該行的上一行寫入到collect_line.h檔案中,從而達到將函數原型寫入到標頭檔中的效果。這個例子是我自己想出來的,原書中沒有該例子。

本章vi命令總結:

這章主要是對上一篇文章所學習的替換命令和Regex進行練習。Regex具有很強的技巧性,只有不斷思考和不斷嘗試,才能紮實地掌握Regex,從而在文本編輯時找到更快速的方法。


相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.