模式匹配的範例:
(1)匹配乙個完整的單詞:如下圖所示,如果需要將文字裡所有的child單詞替換成為children,可能最先想到的就是下圖所示的替換命令:
但是這個命令會把childrendish,fabrichild這兩個單詞中的child都做替換,這不是我們想要的。替換的關鍵就是child要是乙個單獨的單詞,可能又想到如下的方法:
該命令搜尋以空格,逗號,分號結尾的child,並將該child替換為children,同時保留原來child之後的符號。但是該命令仍然會失敗,因為fabrichild也會被替換。
其實很簡單,結合\< 和\>就能匹配出乙個單獨的完整的單詞,如下命令就能完成我們想要的替換工作:
(2)搜尋一般的單詞類:如下圖所示,需要將mgibox,mgrbox,mgabox中的所有box替換成為square,可以採用如下方法:
這個命令中所用到的特殊元字元都在上一篇文章中做了解釋,這裡就不再一一解釋了。
(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)匹配任意數量的任意字串時,正規表示式總是盡可能地匹配出最多的文字;
(2)當我們重新思考乙個匹配模式時,通常比較好的方法是更精準地修改變數(元字元),而不是用特定的文本來限制模式。在模式中運用越多變數,命令的力量就越強大;
(3)有時精確地指定理想結果比起指定不要的結果困難的多。
用:g重複命令:
g命令可以選擇某些行,但是伴隨著的編輯命令卻不一定要要影響這些選擇的行。如下圖所示,該命令能夠將檔案的第11到第12行複製到檔案末尾,並重複10次這樣的複製行為。
解釋一下該命令的工作行為:"1,10g"代表將在檔案的第1至第10行執行搜尋行為,由於搜尋模式只是乙個"^",所以每一行都符合搜尋模式。當選中第一行時,執行後面的編輯命令,將檔案的第11至第12行複製到檔案結尾(該編輯命令與當前選中的第一行沒有關係),接著選中第二行時,再次執行後面的編輯命令,因此將總共執行10次編輯命令,從而達到用:g來重複命令的效果。
收集行:
如下圖所示,在乙個原始檔中,如果要根據所有函式的定義,直接抽出函式原型並匯入到乙個標頭檔案中,可以通過如下命令實現:
該命令的工作行為:首先對整個檔案進行逐行搜尋,搜尋出每乙個以"{"開頭的行,將該行的上一行寫入到collect_line.**件中,從而達到將函式原型寫入到頭檔案中的效果。這個例子是我自己想出來的,原書中沒有該例子。
本章vi命令總結:
vi和vim編輯器
vi vim 是上linux非常常用的編輯器,很多linux發行版都預設安裝了vi vim vi vim 命令繁多但是如果使用靈活之後將會大大提高效率。vi是 visual inte ce 的縮寫,vim是vi improved 增強版的vi 在一般的系統管理維護中vi就夠用,如果想使用 加亮的話可...
Vi和Vim編輯器
vi編輯器是所有unix及linux系統下標準的編輯器,他就相當於windows系統中的記事本一樣.vim 具有程式編輯的能力,可以以字型顏色辨別語法的正確性,方便程式設計 因為程式簡單,編輯速度相當快速。vim可以當作vi的公升級版本,他可以用多種顏色的方式來顯示一些特殊的資訊。vim會依據副檔名...
vi和vim編輯器
所有的linux系統都會內建 vi文字編輯器 vim具有程式編輯的能力,可以看做是vi的增強版本 1 正常模式 在正常模式下,我們可以使用快捷鍵 以vim代開乙個檔案就直接進入正常模式了,在這個模式中可以使用 上下左右 按鍵來移動游標,你可以使用 刪除字元 或 刪除整行 來處理檔案內容,也可以使用 ...