一、Unix編輯器概述
二、Vi入門
2.1 進入vi
在系統提示字符(如$、#)下敲入vi<檔案名稱>,vi可以自動幫你載入所要編輯的文件或是開啓一個新文件(如果該文件不存在或缺少文件名)。進入 vi後螢幕左方會出現波浪符號,凡是列首有該符號就代表此列目前是空的。2.2 兩種模式
如上所述,vi存在兩種模式:指令模式和輸入模式。在指令模式下輸入的按鍵將做爲指令來處理:如輸入 a,vi即認爲是在當前位置插入字符。而在輸入模式下,vi則把輸入的按鍵當作插入的字符來處理。指令模式切換到輸入模式只需鍵入相應的輸入命令即可(如a,A),而要從輸入模式切換到指令模式,則需在輸入模式下鍵入ESC鍵,如果不曉得現在是處於什麼模式,可以多按幾次 [ESC],系統如發出嗶嗶聲就表示已處於指令模式下了。付:在指令模式進入輸入模式的指令:
新增 (append)
a :從光標所在位置後面開始新增資料,光標後的資料隨新增資料向後移動。
A:從光標所在行最後面的地方開始新增資料。
插入 (insert)
i:從光標所在位置前面開始插入資料,光標後的資料隨新增資料向後移動。
I :從光標所在行的第一個非空白字元前面開始插入資料。
開始 (open)
o :在光標所在行下新增一行並進入輸入模式。
O: 在光標所在行上方新增一行並進入輸入模式。
2.3 退出vi
在指令模式下鍵入:q,:q!,:wq或:x(注意:號),就會退出vi。其中:wq和:x是存盤退出,而:q是直接退出,如果文件已有新的變化,vi會提示你保存文件而:q命令也會失效,這時你可以用:w命令保存文件後再用:q退出,或用:wq或:x命令退出,如果你不想保存改變後的文件,你就需要用:q!命令,這個命令將不保存文件而直接退出vi。2.4 基本編輯
配合一般鍵盤上的功能鍵,像是方向鍵、[Insert]、[Delete]等等,現在你應該已經可以利用 vi來編輯文件了。當然 vi還提供其他許許多多功能讓文字的處理更爲方便。何謂編輯?一般認爲是文字的新增、修改以及刪除,甚至包括文字區塊的搬移、複製等等。先這裏介紹 vi的如何做刪除與修改。(注意:在 vi的原始觀念裏,輸入跟編輯是兩碼子事。編輯是在指令模式下操作的,先利用指令移動光標來定位要進行編輯的地方,然後才下指令做編輯。)
常用命令:
x 刪除光標所在字符。
dd 刪除光標所在的行。
r 修改光標所在字元,r後接著要修正的字符。
R 進入取替換狀態,新增文字會覆蓋原先文字,直到按 [ESC]回到指令模式下爲止。
s 刪除光標所在字元,並進入輸入模式。
S 刪除光標所在的行,並進入輸入模式。
gg 讓光標移到首行,在vim纔有效,vi中無效
v 是進入Visual(可視)模式
ctrl + v 進入可視塊模式(可用來選擇列)
G 光標移到最後一行
選中內容以後就可以其他的操作了,比如:
d 刪除選中內容
y 複製選中內容到0號寄存器
"+y 複製選中內容系統的剪貼板,供其他程序用(可以看出,剪切操作也可通過選中然後yy然後d。移動行的話,後面介紹有行方式命令)
dG 這是刪除光標所在行到最後一行的內容(包括光標所在行的內容)。
p 粘貼
全部刪除:按esc後,然後ggdG
全部複製:按esc後,然後ggyG
全選高亮顯示:按esc後,然後ggvG或者ggVG
撤銷:u
重做: ctrl + r
格式化全文: gg=G
其實呢,在PC上根本沒有這麼麻煩!輸入跟編輯都可以在輸入模式下完成。例如要刪除字元,直接按 [Delete]不就得了。而插入狀態與取代狀態可以直接用 [Insert]切換,犯不著用什麼指令模式的編輯指令。不過就如前面所提到的,這些指令幾乎是每臺終端機都能用,而不是僅僅在 PC上。在指令模式下移動光標的基本指令是 h, j, k, l。想來各位現在也應該能猜到只要直接用 PC的方向鍵就可以了,而且無論在指令模式或輸入模式下都可以。多容易不是。當然 PC鍵盤也有不足之處。有個很好用的指令 u可以恢復被刪除的文字,而 U指令則可以恢復光標所在行的所有改變。這與某些電腦上的 [Undo]按鍵功能相同。
三、附件:vi詳細指令表
3.1 進入vi 的命令
vi +n filename: 打開文件,並將光標置於第n行首
vi + filename: 打開文件,並將光標置於最後一行首
vi +/pattern filename: 打開文件,並將光標置於第一個與pattern匹配的串處
vi -r filename: 在上次正用vi編輯時發生系統崩潰,恢復filename
vi filename....filename: 打開多個文件,依次進行編輯
3.2 移動光標類命令
h 光標左移一個字符l 光標右移一個字符
space 光標右移一個字符
Backspace 光標左移一個字符
k或Ctrl+p 光標上移一行
j或Ctrl+n 光標下移一行
Enter 光標下移一行
w或W 光標右移一個字至字首
b或B 光標左移一個字至字首
e或E 光標右移一個字至字尾
) 光標移至句尾
( 光標移至句首
} 光標移至段落開頭
{ 光標移至段落結尾
nG 光標移至第n行首
n+ 光標下移n行
n- 光標上移n行
n$ 光標移至第n行尾
H 光標移至屏幕頂行
M 光標移至屏幕中間行
L 光標移至屏幕最後行
0 光標移至當前行首
$ 光標移至當前行尾
:12 跳轉到第12行
3.3 屏幕翻滾類命令
Ctrl+u 向文件首翻半屏Ctrl+d 向文件尾翻半屏
Ctrl+f 向文件尾翻一屏
Ctrl+b 向文件首翻一屏
nz 將第n行滾至屏幕頂部,不指定n時將當前行滾至屏幕頂部。
3.4 插入文本類命令
i 在光標前I 在當前行首
a 光標後
A 在當前行尾
o 在當前行之下新開一行
O 在當前行之上新開一行
r 替換當前字符
R 替換當前字符及其後的字符,直至按ESC鍵
s 從當前光標位置處開始,以輸入的文本替代指定數目的字符
S 刪除指定數目的行,並以所輸入文本代替之
ncw或nCW 修改指定數目的字
nCC 修改指定數目的行
3.5 刪除命令
ndw或ndW 刪除光標處開始及其後的n-1個字
do 刪至行首
d$ 刪至行尾
ndd 刪除當前行及其後n-1行
x或X 刪除一個字符,x刪除光標後的,而X刪除光標前的
Ctrl+u 刪除輸入方式下所輸入的文本
3.6 搜索及替換命令
/pattern 從光標開始處向文件尾搜索pattern
?pattern 從光標開始處向文件首搜索pattern
n 在同一方向重複上一次搜索命令
N 在反方向上重複上一次搜索命令
s/p1/p2/g 將當前行中所有p1均用p2替代
n1,n2s/p1/p2/g 將第n1至n2行中所有p1均用p2替代
g/p1/s//p2/g 將文件中所有p1均用p2替換
3.7 選項設置
all:列出所有選項設置情況
term:設置終端類型
ignorance:在搜索中忽略大小寫
list:顯示製表位(ctrl+i)和行尾標誌($)
number:顯示行號
report:顯示由面向行的命令修改過的數目
terse:顯示簡短的警告信息
warn:在轉到別的文件時若沒保存當前文件則顯示no write信息
nomagic:允許在搜索模式中,使用前面不帶“/”的特殊字符
nowrapscan:禁止vi在搜索到達文件兩端時,又從另一端開始
mesg:允許vi顯示其他用戶用write寫到自己終端上的信息
3.8 行方式命令
:n1,n2 co n3 將n1行到n2行之間的內容拷貝到第n3行下:n1,n2 m n3 將n1行到n2行之間的內容移至到第n3行下
:n1,n2 d 將n1行到n2行之間的內容刪除
:w 保存當前文件
:e filename 打開文件filename進行編輯
:x 保存當前文件並退出
:q 退出vi
:q! 不保存文件並退出vi
:!command 執行shell命令command
:n1,n2 w!command 將文件中n1行至n2行的內容作爲command的輸入並執行之,若不指定n1,n2,則表示將整個文件內容作爲command的輸入
:r!command 將命令command的輸出結果放到當前行
3.9 寄存器操作
"?nyy 將當前行及其下n行的內容保存到寄存器?中,其中?爲一個字母,n爲一個數字"?nyw 將當前行及其下n個字保存到寄存器?中,其中?爲一個字母,n爲一個數字
"?nyl 將當前行及其下n個字符保存到寄存器?中,其中?爲一個字母,n爲一個數字
"?p 取出寄存器?中的內容並將其放到光標位置處。這裏?可以是一個字母,也可以是一個數字
ndd 將當前行及其下共n行文本刪除,並將所刪內容放到1號刪除寄存器中。
四、補充:vi 正則表達式
Vim中的正則表達式功能很強大,如果能自由運用,則可以完成很多難以想象的操作。
如果你比較熟悉Perl的正規表達式,可以直接參照與Perl正則表達式的區別一節。
1 使用正則表達式的命令
使用正則表達式的命令最常見的就是 / (搜索)命令。其格式如下:
/正則表達式
另一個很有用的命令就是 :s(替換)命令,將第一個//之間的正則表達式替換成第二個//之間的字符串。
:s/正則表達式/替換字符串/選項
在學習正則表達式時可以利用 / 命令來練習。
2 元字符
元字符是具有特殊意義的字符。使用元字符可以表達任意字符、行首、行 尾、某幾個字符等意義。
元字符一覽
元字符 | 說明 |
. | 匹配任意一個字符 |
[abc] | 匹配方括號中的任意一個字符。可以使用-表示字符範圍, 如[a-z0-9]匹 配小寫字母和阿拉伯數字。 |
[^abc] | 在方括號內開頭使用^符號,表示匹配除方括號中字符之外的任意字符。 |
\d | 匹配阿拉伯數字,等同於[0-9]。 |
\D | 匹配阿拉伯數字之外的任意字符,等同於[^0-9]。 |
\x | 匹配十六進制數字,等同於[0-9A-Fa-f]。 |
\X | 匹配十六進制數字之外的任意字符,等同於[^0-9A-Fa-f]。 |
\w | 匹配單詞字母,等同於[0-9A-Za-z_]。 |
\W | 匹配單詞字母之外的任意字符,等同於[^0-9A-Za-z_]。 |
\t | 匹配<TAB>字符。 |
\s | 匹配空白字符,等同於[ \t]。 |
\S | 匹配非空白字符,等同於[^ \t]。 |
另外,如果要查找字符 *、.、/等,則需要在前面用 \ 符號,表示這不是元字符,而只是普通字符而已。
元字符 | 說明 |
\* | 匹配 * 字符。 |
\. | 匹配 . 字符。 |
\/ | 匹配 / 字符。 |
\\ | 匹配 \ 字符。 |
\[ | 匹配 [ 字符。 |
表示數量的元字符
元字符 | 說明 |
* | 匹配0-任意個 |
\+ | 匹配1-任意個 |
\? | 匹配0-1個 |
\{n,m} | 匹配n-m個 |
\{n} | 匹配n個 |
\{n,} | 匹配n-任意個 |
\{,m} | 匹配0-m個 |
表示位置的符號
元字符 | 說明 |
$ | 匹配行尾 |
^ | 匹配行首 |
\< | 匹配單詞詞首 |
\> | 匹配單詞詞尾 |
使用例
/char\s\+[A-Za-z_]\w*; " 查找所有以char開頭,之後是一個以上的空白," 最後是一個標識符和分號 /\d\d:\d\d:\d\d " 查找如 17:37:01 格式的時間字符串 :g/^\s*$/d " 刪除只有空白的行 :s/\<four\>/4/g " 將所有的four替換成4,但是fourteen中的four不替換
3 替換變量
在正規表達式中使用 \( 和\)符號括起正規表達式,即可在後面使用\1、\2 等變量來訪問\( 和\) 中的內容。
使用例
/\(a\+\)[^a]\+\1 " 查找開頭和結尾處a的個數相同的字符串," 如 aabbbaa,aaacccaaa,但是不匹配 abbbaa :s/\(http:\/\/[-a-z\._~\+%\/]\+\)/<a href="\1">\1<\/a>/ " 將URL替換爲<a href="http://url">http://url</a>的格式 :s/\(\w\+\)\s\+\(\w\+\)/\2\t\1 " 將 data1 data2 修改爲 data2 data1
4 函數式
在替換命令 s/// 中可以使用函數表達式來書寫替換內容,格式爲
:s/替換字符串/\=函數式
在函數式中可以使用 submatch(1)、submatch(2) 等來引用 \1、\2 等的內容,而submatch(0)可以引用匹配的整個內容。
使用例
:%s/\<id\>/\=line(".") " 將各行的 id 字符串替換爲行號 :%s/^\<\w\+\>/\=(line(".")-10) .".". submatch(1) " 將每行開頭的單詞替換爲 (行號-10).單詞 的格式," 如第11行的 word 替換成 1. word
5 與Perl正則表達式的區別
元字符的區別
Vim語法 | Perl語法 | 含義 |
\+ | + | 1-任意個 |
\? | ? | 0-1個 |
\{n,m} | {n,m} | n-m個 |
\(和\) | (和) | 分組 |
6 vi 正則表達式練習
:%s/ */ /g 把一個或者多個空格替換爲一個空格。
:%s/ *$// 去掉行尾的所有空格。
:%s/^/ / 在每一行頭上加入一個空格。
:%s/^[0-9][0-9]* // 去掉行首的所有數字字符。
:%s/b[aeio]g/bug/g 將所有的bag、beg、big和bog改爲bug。
:%s/t([aou])g/h1t/g 將所有tag、tog和tug分別改爲hat、hot和hug(注意用group的用法和使用1引用前面被匹配的字符)。
Sed
Sed是Stream EDitor的縮寫,是Unix下常用的基於文件和管道的編輯工具,可以在手冊中得到關於sed的詳細信息。
這裏是一些有趣的sed腳本,假定我們正在處理一個叫做price.txt的文件。注意這些編輯並不會改變源文件,sed只是處理源文件的每一行並 把結果顯示在標準輸出中(當然很容易使用重定向來定製):
sed腳本 描述
sed ’s/^$/d’ price.txt 刪除所有空行
sed ’s/^[ ]*$/d’ price.txt 刪除所有隻包含空格或者製表符的行
sed ’s/”//g’ price.txt 刪除所有引號