學習 Linux,101: 使用 vi 編輯文件
來自: http://www.ibm.com/developerworks/cn/linux/l-lpic1-103-8/index.html?ca=drs-
學習更多知識。開發更多項目。聯系更多同行。
全新的 developerWorks Premium 會員計劃提供了強大的開發工具和資源,包括 500 篇通過 Safari Books Online 提供的頂級技術文章(其中數十篇文章專門針對 Java 開發人員)、最重要開發人員活動的大幅折扣、最新的 O'Reilly 大會的視頻錄像,等等。立即注冊。
</div>
概述
在本教程中,學習 vi 編輯器的基本用法,幾乎所有 Linux 或 UNIX 系統上都提供了它。學習如何:
- 使用 vi 導航文檔
- 使用基本的 vi 模式
- 插入、編輯、刪除、復制和查找文本
本教程將幫助您對 Linux Server Professional (LPIC-1) 考試 101 的主題 103 中的目標 103.8 進行應考準備。該目標的權重為 3。
回頁首
使用 vi 導航文本
vi 編輯器幾乎肯定存在于每個 Linux 和 UNIX 系統上。事實上,如果系統只有一個編輯器,那么該編輯器很可能就是 vi,所以了解如何使用 vi 是值得的。本教程將介紹一些基本的 vi 編輯命令,但要獲得完整的 vi 教程,請查閱我們的 vi 教程 “ vi 介紹 -- 快速參考表 ”,或者查閱手冊頁或許多優秀的圖書。
關于本系列
本教程系列幫助學習 Linux 系統管理任務。您還可以使用這些教程中的資料對 Linux Professional Institute 的 LPIC-1:Linux 服務器專業認證考試 進行應考準備。
請參閱 學習 Linux,101 :LPIC-1 學習路線圖 ”,查看本系列中每部教程的描述和鏈接。這個路線圖正在開發之中,它反映了 2015 年 4 月 15 日更新的 4.0 版 LPIC-1 考試目標。在完成這些教程中,會將它們添加到路線圖中。
前提條件
要從本系列教程中獲得最大收獲,您應該擁有 Linux 的基本知識和一個正常工作的 Linux 系統,您可以在這個系統上實踐本教程中涵蓋的命令。有時程序的不同版本會得到不同的輸出格式,所以您的結果可能并不總是與這里給出的清單和圖完全相同。
回頁首
啟動和導航 vi
大多數 Linux 發行版現在都附帶了 vim(表示 V i IM proved,改進的 vi)編輯器,而不是經典的 vi。Vim 向后兼容 vi,擁有圖形模式 (gvim) 以及標準的 vi 文本模式接口。 vi 命令通常是 vim 程序的別名或符號鏈接。vim 有多個版本:微型、小型、普通、大型和超大型。您可以使用以下命令確定您運行的 vim 版本和它包含哪些特性:
vi --version
您是否還記得前面的教程 “ 學習 Linux,101:進程執行優先級 ” 中介紹更改優先級的部分,我們希望更改運行的 count1.sh shell 腳本的優先級。或許您自己已經嘗試過,就會發現該命令運行得太快了,以至于您沒有足夠的時間使用 renice 完成優先級更改。所以我們首先使用 vi 編輯器在文件的開頭添加一行,讓該命令休眠 20 分鐘,以便我們有時間來更改優先級。
如果還沒有編寫 count1.sh 程序,可以在您的主目錄中打開一個終端窗口并粘貼來自 清單 1的命令。這將在一個名為 lpi103-8 的目錄中創建 count1.sh 并跳轉到該目錄。
清單 1. CPU 密集型腳本 - count1.sh
ian@yoga-u15:~$ mkdir -p lpi103-8 && cd lpi103-8 && { > echo 'x="$1"'>count1.sh > echo 'echo "$2" $(date)'>>count1.sh > echo 'while [ $x -gt 0 ]; do x=$(( x-1 ));done'>>count1.sh > echo 'echo "$2" $(date)'>>count1.sh > } ian@yoga-u15:~/lpi103-8$ cat count1.sh x="$1" echo "$2" $(date) while [ $x -gt 0 ]; do x=$(( x-1 ));done echo "$2" $(date)
要編輯一個現有文件,可以使用 vi 命令并使用一個文件名作為參數。請參閱手冊頁或參考資料來獲取許多可用選項的細節。現在只需要使用沒有選項的命令:
vi count1.sh
這個命令應該會打開 count1.sh 文件。您會看到一個類似 清單 2的顯示界面。如果使用 vim,一些單詞或字符可能帶有顏色。Vim 擁有一種語法突出顯示模式(最初的 vi 編輯器中沒有該模式),該模式默認情況下可能已在您系統上打開。
</div>
清單 2. 使用 vi 編輯 count1.sh
x="$1" echo "$2" $(date) while [ $x -gt 0 ]; do x=$(( x-1 ));done echo "$2" $(date) ~ ~ ~ ~ "count1.sh" 4 lines, 84 characters
vi 編輯器可追溯到還不是所有終端鍵盤都擁有光標移動鍵的時代,所以,在 vi 中可以完成的所有操作都可以使用標準打字機上通常可找到的鍵和另外兩個鍵(比如 Esc 和 Insert )來完成。但是,如果有其他鍵可用,那么可以配置 vi 來使用這些鍵;您鍵盤上的大部分建都可以在 vi 中派上用場。由于此傳承和早期終端連接的緩慢性質,vi 當之無愧地就獲得了命令非常簡單且神秘的評價。我們首先看看用于導航文件的鍵。
移動
這些命令幫助您在文件內移動:
- h
- 在當前行上左移一個字符。
- j
- 下移到下一行。
- k
- 上移到上一行。
- l
- 在當前行上右移一個字符。
- w
- 在當前行上移到下一個單詞。
- e
- 在當前行上移動到下一個詞尾。
- b
- 在當前行上移動到上一個詞頭。
- Ctrl-f
- 向前翻一頁。
- Ctrl-b
- 向后翻一頁。
如果您在任何這些命令前鍵入一個數字,該數字就是命令的執行次數。這個數字被稱為 重復次數 或簡單地稱為 次數 。例如,5h 表示將會左移 5 個字符。您可以將重復次數與許多 vi 命令結合使用。
移動到行
以下命令可以幫助您移動到文件中的特定行:
- G
- 移動到文件中的某個特定行。例如,3G 移動到第 3 行。沒有參數時,G 移動到文件的最后一行。
- H
- 相對移動到屏幕上的頂行。例如,3H 移動到從屏幕頂部往下第 3 行。
- L
- 與 H 類似,但移動與屏幕上的底行相對。因此,2L 移動到屏幕上倒數第二行。
練習這些命令,直到您熟悉文件中的移動。如果遇到麻煩和命令未按預期的運行,請繼續閱讀,學習如何退出文件。
退出 vi
對于一個新編輯器,需要知道的最有用的操作之一就是,如何在您執行任何不應執行的操作(比如銷毀某個重要的配置文件)之前退出它。要退出 vi,可以保存或丟棄更改,或者從頭重新啟動。如果這些命令不起作用,那么您可能處于插入模式,稍后將會介紹該模式。如果存在懷疑,請按下 Esc 退出插入模式并返回到命令模式,這時這些命令應該會生效。
- :q!
- 退出文件的編輯并丟棄所有更改。這是消除麻煩的一個常見命令。
- :w!
- 寫入文件(無論是否已修改)。嘗試重寫現有文件或只讀取其他不可寫的文件。您可以提供一個文件名作為參數,寫入這個文件而不是您最初使用的文件。通常省略 ! 會更安全一些,除非您知道自己在做什么。
- ZZ
- 如果文件已修改,那么請寫入它。然后退出。這是正常退出 vi 的常見命令。
- :e!
- 編輯文件的當前磁盤副本。這會重新加載文件,丟棄您執行的更改。如果磁盤副本出于其他原因已發生更改,而且您想要使用最新的版本,那么也可以使用此命令。
- :!
- 運行一個 shell 命令。鍵入該命令并按下 Enter 。在命令完成時,您會看到輸出和一條返回到 vi 編輯狀態的提示。
備注:
- 鍵入冒號 (:) 時,您的光標將移動到屏幕的底行,您可以在這里鍵入該命令和任何參數。
- 如果省略上述命令中的感嘆號,您可能會收到一條錯誤消息,比如表明更改為保存或輸出文件無法寫入(例如您在編輯一個只讀文件)的消息。
- : 命令具有更長的形式(:quit、:write、:edit),但這些更長的形式很少使用。
回頁首
vi 模式
vi 編輯器有兩種操作模式:
- 命令模式
- 在命令模式中,您在文件中移動并執行編輯操作,比如搜索文本,刪除文本,更改文本等。通常,您一開始處于命令模式。
- 插入模式
- 在插入模式中,您將新文本鍵入到文件中的插入點處。要返回到命令模式,可以按下 Esc (Escape) 鍵。
這兩種模式確定了編輯器的行為方式。您在插入模式下鍵入的任何內容都被視為要插入到文件中的文本。如果嘗試鍵入一個命令但沒有得到任何結果,或者字符出現在光標下,那么您可能忘記按下 Esc 來離開插入模式了。
回頁首
編輯文本
學習在 vi 中打開一個文件,在其中移動并退出,學會這些之后,是時候學習如何編輯文件中的文本了。
修改文本
在需要插入、刪除或修改文本時,使用以下命令。請注意,其中一些命令具有與小寫形式類似的大寫形式;請參閱下面的描述。
- i
- 在當前位置的字符的前面進入插入模式。鍵入您的文本并按下 Esc 返回到命令模式。使用 I 會在當前行的開頭插入內容。
- a
- 在當前位置的字符的后面進入插入模式。鍵入您的文本并按下 Esc 來返回到命令模式。使用 A 會在當前行的末尾插入內容。
- c
- 使用 c 更改當前字符并進入插入模式來鍵入替換字符。
- o
- 在當前行下方打開一個新行來插入文本。使用 O 在當前行上方打開一行。
- cw
- 刪除當前單詞的剩余內容并進入插入模式來替換它。使用一個重復次數來替換多個單詞。使用 c$ 來替換行尾。
- dw
- 與上面的 cw(和 c$)相同,但未進入插入模式。
- dd
- 刪除當前行。使用一個重復次數來刪除多行。
- x
- 刪除光標位置的字符。使用一個重復次數來刪除多個字符。
- p
- 將最后刪除的文本放在當前字符之后。使用 P 可將它放在當前字符的前面。
- xp
- x 和 p 的這種組合是一種有用的命令。它將光標位置的字符與它右側的字符交換。
搜索文本
您可以使用正則表達式在您文件中搜索文本:
- /
- 使用 / 后跟一個正則表達式在文件中向前搜索。
- ?
- 使用 ? 后跟一個正則表達式在文件中向后搜索。
- n
- 使用 n 在一個方向重復上次的搜索。
您可以在上述任何命令的前面添加一個表示重復次數的數字。所以 3/x 將從當前點開始查找第三次出現的 x,/x 后跟 2n 也是如此。類似地,2/^e 將從當前位置開始查找第二個以 e 開頭的行。
請注意,該搜索在到達文件底部后將返回到頂部搜索。
獲取幫助
vi 中另一個有用的命令是 help 命令,您可以鍵入 :help 來調用它。幫助信息將會在 vi 內打開,可以使用 :q 命令離開幫助并返回到工作中。如果您想要獲得針對某個特定主題的幫助,比如換行,可以在 :help 命令后添加一個單詞,例如: :help wrap 。
融會貫通
我們首先希望向 count1.sh 文件添加一行。為了保留原始版本并將修改后的版本保存為 count2.sh,我們可以在使用 vi 打開該文件后使用這些 vi 命令。請注意,<Esc> 表示按下 Esc 鍵。
清單 3. 將一行添加到 count1.sh 中的編輯器命令
1GOsleep 20<Esc>:w! count2.sh:q
這些命令執行以下操作:
- 1G
- 移動到文件的第一行
- O
- 在它上方打開一個新行并進入插入模式
- sleep 20
- 您想要添加的新文本
- <Esc>
- 按下 Esc 鍵返回到命令模式
- :w! count2.sh
- 將文件寫入磁盤
- :q
- 關閉 vi
知道如何做之后就會很簡單。
這是考試 101 - 主題 103:GNU 和 UNIX 命令的最新教程。請參閱我們的系列路線圖,了解本系列中其他教程的說明和鏈接。
</div>