Linux之vim編輯器和bash算術運算入門
Linux的命令列介面下面有非常多的文字編輯器。比如經常聽說的就有Emacs、pico、nano、joe與vim等。vim可以看做是vi的高階版。我們為什麼一定要學習vim呢?有以下幾個原因:
(1)所有的Unix like系統都會內建vi文字編輯器,其他的文字編輯器則不一定會存在。
(2)很多軟體的編輯介面都會主動呼叫vi。
(3)vim具有程式編輯的能力,可以主動以字型顏色辨別語法的正確性,方便程式設計。
(4)程式簡單,編輯速度快。
下面先介紹一下vi的基本使用方法及其相關命令。
vim編輯器的三種模式:一般模式;編輯模式;末行模式和命令列模式。
在一般模式中可以進行刪除、複製和貼上的功能,但是無法編輯檔案內容。從一般模式切換到編輯模式可以按下i、I、o、O、a、A、r、R鍵。按下Esc鍵可以回到一般模式。在一般模式中輸入:、/、?三個中的任意一個可以將游標移到最下面的一行。在這個模式中可以提供查詢資料的操作,而讀取、儲存、大量替換字元、離開vii、顯示行號等操作則是在此模式中完成的。需要注意的是,編輯模式與命令列模式之間是不能互相切換的。
下面列出平時用的最多的vi命令:
移動游標的方法:
[Ctrl]+[f]:螢幕向下移動一頁,相當於[PageDown]按鍵。
[Ctrl]+[b]:螢幕向上移動一頁,相當於[PageUp]按鍵。
0或功能鍵[Home]:移動到這一行的最前面字元處。
$或功能鍵[End]:移動到這一行的最後面字元處。
G:移動到這個檔案的最後一行。
gg:移動到這個檔案的第一行,相當於1G.
N[Enter]:N為數字,游標向下移動N行。
查詢和替換:
/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:從第一行到最後一行尋找word1這個字串,並且將其替換為word2.且在替換前顯示提示字元給使用者確認是否需要替換。
刪除、複製和貼上:
x,X:在一行字中,x為向後刪除一個字元(相當於[Del]鍵),X為向前刪除一個字元(相當於[Backspace])。
dd:刪除游標所在的一整行。
ndd:刪除游標所在的向下n行。
yy:複製游標所在的一行。
nyy:複製游標所在的向下n行。
p,P:p為將已複製的內容在游標的下一行貼上,P則為貼上在游標的上一行。
u:復原前一個操作。
[Ctrl]+r:重做上一個操作。
.:小數點,重複前一個操作。
一般模式切換到編輯模式:
i,I:進入插入模式,i為從目前游標所在處插入。I為在目前所在行的第一個非空格字元處開始插入。
a,A:進入插入模式。a為從目前游標所在處的下一個字元處開始插入。A為從所在行的最後一個字元處開始插入。
o,O:進入插入模式。o為在下一行插入。O為在上一行插入。
r,R:進入替換模式。r只替換游標所在那個字元一次。R會一直替換游標所在字元,直到按下Esc鍵。
一般模式切換到命令列:
:w:將編輯的資料寫入到硬碟中。
:q:離開vi.後面加!為強制離開。
:wq:儲存後離開。:wq!為強制儲存後離開。
vim末行模式:
內建的命令列介面
(vim內建的命令列介面,是一個能夠使得vim功能更完善,更強大,我們要想實現在末行模式下實現文字編輯功能,就需要先學會地址定界)
(1)地址定界
:start_pos[,end_pos] //起始位置和結束位置,中間用逗號隔開;
#:特定的第#行,例如5即第5行;
.:點號表示當前行;
%:全文;
$:最後一行;
#,#:指定行範圍,左側為起始行,右側為結束行;
#,+#:指定行範圍,左側為起始行絕對編號,右側為相對左側行號的偏移量;
/pattern/:從游標所在處起始向檔案尾部第一次被模式所匹配到的行;
r /PATH/FROM/SOMEFILE:將指定的檔案中的文字讀取並插入到指定位置;
例如:
3,+7 //表示一共8行內容。
.,$-1 //表示當前行到倒數第二行;
1,$ //表示全文
/pat1/,/pat2/:表示從游標所處的位置開始向後,第一次被第一個模式所匹配到的行開 始,到第二個模式第一次所匹配到的行結束;(一般地址定界是不會 使用這樣的兩個模式進行定界)
上面的地址定界可同編輯命令一同使用,實現編輯操作:
d:刪除,直接加在地址定界之後,中間不要加空格
y:複製
c
定界與命令之間都不要加空格
w/PATH/TO/SOMEFILE:將範圍內的文字儲存至指定的檔案中;
r/PATH/FROM/SOMEFILE:將指定的檔案中的文字讀取並插入至指定的位置;
(2)查詢:
/PATTERN:從當前游標所在處向檔案尾部查詢能夠被當前模式匹配到的所有字 符串;
?PATTERN:從當前游標所在處向檔案首部查詢能夠被當前模式匹配到的所有 字串
n:下一個,以命令方向相同;
N:上一個,以命令方向相反;
(3)查詢並替換
s:末行模式的命令;使用格式:
s/要查詢的內容/替換為的內容/修飾符
要查詢的內容:可使用正則表示式;
替換為的內容:不能使用正則表示式,但是可以引用;
如果“要查詢的內容”在模式中使用了分組符號:在“替換為的內容”中使用後向引用;
直接引用查詢模式匹配到的全部文字,要使用&符號;
修飾符:
i:忽略大小寫;
g:全域性替換,意味著一行中如果匹配到多次,則均替換;
舉例:
例一
:1,20s/this/This/g //表示在末行模式下,將第一行到第20行的所有this替換為“This”
例二
:1,20s/this/THIS/gi //表示在末行模式下,將第一行到第20行的所有this替換為“This” 不區分大小寫;
例三
:%s/\/cgroup\/systemd/\/etc\/sysconfig/g //表示將目錄“/cgroup/systemd”全文替換 為“/etc/sysconfig/g”
注意:到我們遇到例三這樣的查詢內容與替換內容中出現了與格式中的斜線“/”相同的符號時,我們可以把分隔符替換為其他非常用的字元:
例[email protected]@@或s###
則例三我們就可以這樣寫了:
:%[email protected]/cgroup/[email protected]/etc/[email protected]
上面的寫法就避免了當我們查詢或者替換內容出現與分隔符相同的符號時,還需要轉義的麻煩事
例四:
我門來一個麻煩的操作,如果讓我們替換這個檔案中所有以小寫“t”開頭的單詞,開頭全部為大寫,全文中不管是什麼單詞,只要是以小寫“t”開頭,開頭全部替換為大寫
%[email protected]\<t\([[:alpha:]]\+\)\>@T\[email protected]
例五:
給全文中以小寫字母t開頭的單詞後面都加上“er”
%[email protected]\<t[[:alpha:]]\+\>@&[email protected]
例六:
將檔案中所有的註釋行刪除: %[email protected]^#@@g
練習:
1.複製/etc/grub.conf檔案至/tmp目錄中,用查詢替換命令刪除/tmp/grub.conf檔案中以空白字元開頭的行的行首的空白字元;
解:
%[email protected]^[[:space:]]\[email protected]@g
2.複製/etc/rc.d/init.d/functions檔案至/tmp目錄中,用查詢替換命令為/tmp/functions檔案的每個以空白字元開頭的行的行首加上#;
解:
%[email protected]^[[:space:]]\[email protected] #&@g
(如果某一行,他只有一個空白字元,那麼他需不需要加#,如果我們期望這個行一定有一個有用的字元,而不僅僅是一個空白行,)
%[email protected]^[[:space:]]\+[^[:space:]]@#&@g
3.為/tmp/grub.conf檔案的前三行的行首加上#號;
4.將/etc/yum.repos.d/CentOS-Base.repo檔案中所有的enabled=0替換為enabled=1,所有gpgcheck=0替換為gpgcheck=1;
解:
%[email protected]\(enabled\|gpgcheck\)[email protected]\[email protected]
vim的多檔案功能:
多檔案:
vim FILE1 FILE2 ....
在檔案間切換:
:next 下一個
:prev 上一個
:first 第一個
:last 最後一個
退出所有檔案:
:wqall 儲存所有檔案並退出
:wall 儲存所有檔案
:qall 退出所有檔案
多視窗:
-o:小寫,水平分割視窗;
-O:大寫,垂直分割視窗;
在視窗間切換:一起按Ctrl+w,然後再按方向鍵,即水平分割時就按左右箭頭,垂直分 割時就按上下箭頭。
注意:單個檔案也可以分割為多個視窗進行檢視:
Ctrl+w s:水平分割視窗;
Ctrl+w v:垂直分割視窗;
退出視窗也是使用q命令進行退出,但是僅使用q命令,是退出當前視窗,只有qall是退出當前所有。
定製vim的工作特性:
注意:在末行模式下的設定,僅對當前的vim程序有效;
永久有效,就需要編輯配置檔案
全域性的配置檔案
/etc/vimrc
使用者個人的配置檔案
~/.vimrc
(注意:使用者個人的配置檔案可能不存在,需要我們手動建立,切換到指定使用者的家目錄,然後執行命令:“vim .vimrc”然後將我們想要的特性直接寫在這個檔案中即可。
比如我們要想vim編輯器再開啟檔案時顯示行號,那麼我們就在“.vimrc”檔案中寫上“set nu”,如果還想定製其他命令,那麼一次寫在這個檔案中即可。)
(1)行號
顯示:set number 簡寫為 set nu
取消顯示:set nonumber 簡寫為 set nonu
(2)括號匹配高亮顯示
匹配:set showmatch簡寫為set sm
取消這種機制:set noshowmatch簡寫為 set nosm
(3)自動縮排功能
啟用:set ai
禁用:set noai
(4)高亮搜尋
啟用:set hlsearch
禁用:set nohlsearch
(5)語法高亮
啟用:syntax no
禁用:syntax off
(6)忽略字元大小寫
啟用:set ic
禁用:set noic
末行模式下獲取幫助:
:help
:help關鍵詞
vim的末行模式非常強大,我們可以在末行模式輸入help來獲取幫助,然後退出幫助,也是同理退出當前視窗,則使用“:q”來退出,如果想獲取某個命令怎樣用,則我們使用“:help 後跟關鍵詞”
目前主要的編輯器都有恢復功能,vim也不例外。vim是通過“儲存”檔案來挽回資料的。
每當我們在用vim編輯時,vim都會自動在被編輯的檔案的目錄下面再新建一個名為filename.swap的檔案。這就是一個暫存檔案,我們對檔案filename所做的操作都會被記錄到這個檔案當中。如果系統意外崩潰,導致檔案沒有正常儲存,那麼這個暫存檔案就會發揮作用。下面用一個例子來說明(Note:我用的是Ubuntu)。
開啟終端,輸入命令,將etc目錄下面的manpath.config複製到tmp目錄下面,並且更改當前工作目錄為tmp:
cp /etc/manpath.config /tmp
cd /tmp
用vim編輯manpath.config檔案:vim manpath.config。
我們在vim的一般模式下按下Ctrl+z組合鍵,vim就會被丟到後臺執行。回到命令提示符環境後,我們模擬將vim的工作不正常中斷。
kill -9 %1;強制殺死制定的程序。
這樣導致暫存檔無法通過正常的流程結束,所以暫存檔案不會消失,而是繼續保留下來。當再次編輯那個檔案時(輸入命令vim manpath.config),出現(ubuntu 11.10):
這時,有六個按鈕可以使用:
O(pen for Read-Only):開啟成只讀檔案。
E(dit):用正常方式開啟要編輯的檔案,並不會載入暫存檔案的內容。這很容易出現兩個使用者相互改變對方的檔案的問題。
R(ecover):載入暫存檔案的內容。
D(elete):如果你確定這個暫存檔案是沒有用的,則可以刪除。
Q(uit):不進行任何操作,回到命令列。
A(bort):忽略這個編輯行為,和Q類似。
需要注意的是:這個暫存檔案不會應為你結束vim後自動刪除,必須要手動刪除。否則每次開啟對應的檔案時都會出現這樣的提示。
vim的功能
【1】塊選擇:
這個功能可以讓我們複製一個矩形區域的內容,十分方便。
v:字元選擇,會將游標經過的地方反白選擇;
V:行選擇;
Ctrl+v:塊選擇;
y:複製反白的地方;
d:刪除反白的地方。
【2】多檔案編輯
我們在兩個或多個檔案之間複製貼上內容時,這個功能會讓我們方便很多。
使用命令vim name1 name2 name3...(各個檔名之間用空格隔開)可以同時開啟多個檔案。
:n:編輯下一個檔案;
:N:編輯上一個檔案;
:files:列出目前vim開啟的所有檔案。
【3】多視窗功能
可以在一個視窗中開啟多個檔案。