要透過 SSH 遠端管理 Linux 伺服器,編輯設定檔是每天的日常,而伺服器上幾乎一定內建、也最常見的文字編輯器就是 vi。這篇整理我當初學 vi 時記下的重點:三種操作模式的差別,以及一般模式、編輯模式、指令列命令模式各自的常用按鍵,讓你不用每次都搜尋「vi 怎麼存檔離開」。
為什麼管理 Linux 伺服器一定要會 vi?
若要使用 Linux 來管理伺服器,文書處理是很重要的,因此會需要了解如何操作 Linux 裡的文字編輯軟體 vi。呼叫 vi 的方式很簡單,在終端機輸入 vi 檔名 即可,例如:
vi /etc/hosts

vi 的三種使用模式是什麼?
因為 vi 是純鍵盤操作,又要同時支援打字與下指令,所以它把操作分成三種模式:
- 一般模式:可以使用「上下左右」按鍵移動游標,能用「刪除字元」或「刪除整行」處理檔案內容,也可以用「複製、貼上」處理文件資料。
- 編輯模式:用來編輯檔案內容。按下
i, I, o, O, a, A, r, R其中一個鍵即可進入編輯模式,畫面左下方會出現INSERT或REPLACE字樣。 - 指令列命令模式:輸入
:或/就會把游標移到最底下那一行,可進行儲存、搜尋等動作。

上圖左下方的 I(INSERT)代表現在正處於編輯模式。按 Esc 隨時可以退回一般模式——記住「任何時候先按 Esc 就對了」,是 vi 新手最重要的保命招。
一般模式有哪些常用按鍵?
在一般模式下可以移動游標、搜尋、刪除、複製貼上:
| 按鍵 | 說明 |
|---|---|
[Ctrl] + [f] | 螢幕「向前」移動一頁 |
[Ctrl] + [b] | 螢幕「向後」移動一頁 |
/word | 向游標之後尋找字串 word |
?word | 向游標之前尋找字串 word |
:n1,n2s/word1/word2/g | 在第 n1 與 n2 行之間把 word1 取代為 word2 |
:1,$s/word1/word2/g | 從第一行到最後一行把 word1 取代為 word2 |
:1,$s/word1/word2/gc | 同上,但取代前顯示提示字元讓使用者確認 |
x / X | 向後/向前刪除一個字元 |
dd | 刪除游標所在的那一整列 |
yy | 複製游標所在的那一行,20yy 則是複製 20 列 |
p / P | 在游標下一行/上一行貼上複製的資料 |
u | 復原前一個動作 |
編輯模式怎麼進入與離開?
從一般模式按下以下任一個鍵即可進入編輯模式:
i, I(插入):在目前游標所在處插入輸入的文字,已存在的文字會向後退。a, A(增加):從目前游標所在的下一個字開始輸入,已存在的文字會向後退。o, O(插入新的一行):從游標所在的下一行行首開始輸入文字。r, R(取代):r會取代游標所在的那一個字元;R會一直取代游標所在的文字,直到按下Esc為止。Esc:退出編輯模式,回到一般模式。
指令列命令模式怎麼存檔與離開?
輸入 : 進入指令列命令模式,常用的存檔、離開與其他指令如下:
| 指令 | 說明 |
|---|---|
:w | 將編輯的資料寫入硬碟檔案中 |
:q | 離開 vi |
:wq | 儲存後離開;:wq! 為強制儲存後離開 |
:e! | 將檔案還原到最原始的狀態 |
ZZ | 檔案沒有更動則不儲存離開;有更動則儲存後離開 |
:w [filename] | 將編輯的資料另存成另一個檔案 |
:r [filename] | 讀入另一個檔案的內容,加到游標所在行後面 |
:set nu | 顯示行號;:set nonu 則取消行號 |
n1,n2 w [filename] | 將第 n1 到 n2 行的內容儲存成 filename |
:! command | 暫時離開 vi 到指令列執行 command,例如 :! ls /home |
指令後面加上 ! 就代表強制執行。
常見問題
vi 跟 vim 有什麼差別?
vim 是 vi 的加強版,相容 vi 的所有操作並新增語法高亮、多重復原等功能。在多數 Linux 發行版上輸入 vi 實際啟動的往往就是 vim,這篇的操作按鍵兩者通用。
vi 裡怎麼搜尋並取代字串?
在指令列命令模式輸入 :1,$s/word1/word2/g 可以把整個檔案的 word1 取代為 word2;若把結尾改成 gc,每次取代前會先詢問確認,建議新手都加上 c 比較安全。
vi 沒有存檔想放棄編輯怎麼辦?
先按 Esc 回到一般模式,再輸入 :q! 強制離開不儲存;若想還原到檔案最初的狀態但繼續編輯,可以輸入 :e!。
為什麼我在 vi 裡打字出現亂碼或一直在跳?
那表示你停留在一般模式,按下的英文字母被當成指令執行了。先按 Esc 確認回到一般模式,再按 i 進入編輯模式即可正常打字。
vi 怎麼顯示行號?
在指令列命令模式輸入 :set nu 即可顯示行號,輸入 :set nonu 則取消。顯示行號對照錯誤訊息修改設定檔時特別有用。
參考資料
延伸閱讀
- Linux 用 pm2 來管理伺服器:同樣聚焦 Linux、伺服器管理,可接著比較不同情境的做法。
- 利用 netstat 查詢連線數量(connections):同樣聚焦 Linux、伺服器管理,可接著比較不同情境的做法。
- 使用 PM2 管理 Node.js 伺服器教學:同樣聚焦 伺服器管理,可接著比較不同情境的做法。
最後更新
2026-08-28(原文發布於 2019-09-20,本文保留原始筆記內容並補上 GEO 結構。)
關於作者
Claire Chang | 企業 AI 導入與流程轉型顧問。專注於 AI Agent 架構設計、ERP 系統整合與企業 AI 治理。
首次發布:2019-09-20
