計算機軟件基礎(chǔ):07第二章UNIX工具backus-vi_第1頁
計算機軟件基礎(chǔ):07第二章UNIX工具backus-vi_第2頁
計算機軟件基礎(chǔ):07第二章UNIX工具backus-vi_第3頁
計算機軟件基礎(chǔ):07第二章UNIX工具backus-vi_第4頁
計算機軟件基礎(chǔ):07第二章UNIX工具backus-vi_第5頁
已閱讀5頁,還剩9頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

PAGE1《計算機軟件基礎(chǔ)》多媒體教程第七講第二章 UNIX的軟件工具2.1Unix軟件開發(fā)工具簡介文本編輯工具(texteditor,編輯器,編輯程序)軟件工具分類適合于字符終端適合于圖形終端功能特點行文本編輯ed,ex面向行交互文本編輯vi,vim,emacsxeditor等面向字符字符流編輯sed,awk面向整個文件部分編輯功能tr,dd,sort,uniq等非編輯工具,具有可利用的編輯功能文本格式化工具(documentgeneration)書寫文檔資料(documentation) 按格式自動排版文本文件,編寫連機用戶手冊(onlinemanual) nroff,troff,tbl,eqn撰寫學術(shù)論文(paperandthesis) tex,latex,poscript(ps),pdf軟件維護工具(softwaremaintanence)軟件編譯和生成,或工程組織等過程的自動輔助工具 make版本管理工具(versioncontroller) SCCS,CVS,SVN等庫函數(shù)管理(archive) ar等軟件調(diào)試查錯工具(debuggingtools) 功能:設(shè)置斷點;跟蹤運行;單步或多步;監(jiān)視數(shù)據(jù)變化;設(shè)定循環(huán)次數(shù);條件運行等適合于字符終端 adb,sdb,gdb適合于圖形終端 dbx,dbxtool,wdb,ddd,...編譯器生成工具(compilergeneration)詞法編譯器生成工具(lexicalgeneration) lex語法編譯器生成工具(yetanothercompilercompiler) yacc軟件工具中各種命令使用格式的約定正體字“abc” 語法規(guī)定的字符,不能改變。斜體字“abc” 命令參數(shù),具體值由用戶根據(jù)需要決定。省略號“...” 重復(fù)在省略號前面的內(nèi)容。方括號“[xyz]” 方括號內(nèi)的內(nèi)容可以省略,如需要使用方括號將專門說明?;剀嚪? 必要處用⊕或者<CR>表示,禁止出現(xiàn)將專門說明。明顯需要回車符 的地方可能省略,例如大多數(shù)結(jié)束命令的回車符都將省略。空格 必要處用□表示,禁止出現(xiàn)將專門說明,明顯需要空格的地方可省略??刂品? 用^X表示,如^D。下劃線“abc” 用戶鍵入的數(shù)據(jù)或者字符,用下劃線表示。缺省 在明顯的情況將省略以上的約定。例外 與以上約定不符的例外情況將專門說明。約定示例:[i[,j]]d⊕ “:”和d是規(guī)定字符。i和j的值由用戶確定,“,j”可以省略或者“i,j”都可省略?;剀嚪挷荒苁÷浴i[file[...]] vi命令可以沒有參數(shù),或者帶一個或者多個file。省略了明顯需要的回車符。echo$a□$b $a$b 標出空格,表示$a□$b與$a$b的效果不同。省略了回車符。變量=值 禁止空格,規(guī)定等號=的兩側(cè)不能出現(xiàn)空格。iHi⊕Bye<ESC> i和<ESC>是命令(不顯示),其余由用戶輸入(下劃線)。禁止回車符。[□表達式□] 方括號[]是規(guī)定字符,不能省略,空格不能省略。2.2BACKUS系統(tǒng)什么是BACKUS系統(tǒng) 由約翰?巴克斯(JohnWarnerBackus)和彼得?諾爾(PeterNaur)發(fā)明的BACKUS系統(tǒng),通常稱為BNF范式(BackusNaurForm,巴克斯-諾爾范式),是一種針對計算機語言的形式化描述語言,或者說是一種描述計算機語言語法的符號集。 計算機面對任何形式的字符流或者命令流,都可以看成是具有一定語法和詞法規(guī)則的語言。這種語言可以是文字形式,例如各種輸入的數(shù)據(jù)文件或者文本文件、用shell命令或者shell程序表達的操作命令;也可以是圖形界面形式,例如在窗口中用菜單命令表達的操作命令。而BNF范式恰恰可以用來描述任何一種形式化語言的語法和詞法結(jié)構(gòu)。 我們在學習UNIX的軟件工具時,將借鑒BNF范式來描述需要處理的文本文件的語法結(jié)構(gòu)和詞法結(jié)構(gòu),以便使得文字處理工具比較容易理解和掌握。BNF范式的定義 設(shè)∑是不含有符號::=,<,>和|的終結(jié)符(字符)集合; 用括號<>括起來的終結(jié)符的組合,稱為變量V; 終結(jié)符和變量的組合稱為字W; 形為V::=W1|W2|...|Wn的表達式稱為產(chǎn)生式; 由有限個產(chǎn)生式組成的系統(tǒng)稱為BNF范式。 本課程約定關(guān)于數(shù)字和字母的定義可以省略: <數(shù)字>::=0|1|2|3|4|5|6|7|8|9 <字母>::=<大寫字母>|<小寫字母> <大寫字母>::=A|...|Z <小寫字母>::=a|...|zBNF范式描述計算機語言的典例 用BNF范式描述某種語言(例如A語言)的形式為: ∑={字符1,字符2,...,字符n} <A語言>::=<語法>... A語言由若干語法成分組成 <語法>::=<子語法>... 語法由若干子語法成分組成 <子語法>::=<詞法>... 子語法由若干詞法成分組成 <詞法>::=字符集合... 詞法由若干字符集合組成 字符集合::=字符... 字符集合由若干字符組成BNF范式的特征 BNF范式具有描述形式化語言的三種基本特征:順序性、選擇性和重復(fù)性。順序性:按確定的次序定義產(chǎn)生式中的成分。 例如,由A、B和C的順序排列組成X,描述為: X::=ABC選擇性:產(chǎn)生式可以從多個可能的成分中選一個,用符號“|”表示連接。 例如,X的組成可能是A和B中的一個,描述為: X::=A|B 特別地,A可以是空,即可以表述為: X::=|B重復(fù)性:產(chǎn)生式可以由某個成分的多次重復(fù)組成,并采用遞歸的形式表示。 例如,X由多個A組成,描述為: X::=A|XA 右遞歸 或者 X::=A|AX 左遞歸【例2-1】用BNF范式表達的簡單算術(shù)表達式SAE(SimpleArithmaticExpression)。 ∑={0-9,.,+,-.*,/,(,)} <SAE>::=<number>|<SAE><op><SAE>|(<SAE>) <number>::=<數(shù)字>.|<數(shù)字><number> <op>::=+|-|*|/ 例如: 7.,372.,(2.+14.),3.*(5.-2.)+7. 都是<SAE> .5,7.3,A,(2.+14.)+ 都不是<SAE> 分析過程示例:(1) 7是<digit>,7.符合<digit>.,是<number>,<number>是<SAE>,所以7.是<SAE>。(2) 5.-2.符合<SAE><op><SAE>,(5.-2.)符合(<SAE>), 3.*(5.-2.)和3.*(5.-2.)+7.都符合<SAE><op><SAE>,所以3.*(5.-2.)+7.是SAE。(3) 2.+14.符合<SAE><op><SAE>,(2.+14.)符合(<SAE>), (2.+14.)+不符合<SAE><op><SAE>,所以(2.+14.)+不是SAE。【例2-2】用BNF范式表達的無括號表達式PFE(ParenthesesFreeExpression)。 ∑={0-9,.,+,-.*,/} <PFE>::=<number>|<PFE><PFE><op> <number>::=<數(shù)字>.|<數(shù)字><number> <op>::=+|-|*|/ 例如: 7.,372.,2.14.+,3.5.2.-*7.+ 都是<PFE> 7.*5.3.7.-,A,2.6.8.+1./5.* 都不是<PFE> 分析過程示例:(1) 2.和14.都是PFE,2.14.+符合<PFE><PFE><op>,是PFE。(2) 5.2.-符合<PFE><PFE><op>,3.5.2.-*符合<PFE><PFE><op>, 3.5.2.-*7.+符合<PFE><PFE><op>,所以3.5.2.-*7.+是PFE。(3)3.7.-符合<PFE><PFE><op>,7.*不符合<PFE><PFE><op>,且 5.3.7.-不符合<PFE><PFE><op>,所以7.*5.3.7.-不是PFE?!纠?-3】用BNF范式描述X格式的文件 ∑={0-9,A-Z,a-z,=,⊕} <文件>::=<定義行>|<文件><定義行> <定義行>::=<變量>=<數(shù)值>⊕ <變量>::=<字母串> <數(shù)值>::=<整數(shù)串> 例如,以下文件datain符合X格式: RES□=□12⊕ CAP□=□9⊕ DIOD□=□20⊕【例2-4】用BNF范式表達電路分析程序SPICE中描述電阻的語句格式為 電阻名 節(jié)點號 節(jié)點號 電阻值 單位 例如圖中所示:R10320K 假定一個文件的內(nèi)容全部由電阻語句組成,則相應(yīng)的BNF范式定義為: ∑={0-9,A-Z,a-z,⊕} <File>::=<state>|<File><state> <state>::=R<name><node><node><value><unit>⊕ <name>::=<char>|<name><char> <node>::=<數(shù)字>|<node><數(shù)字> <value>::=<數(shù)字>|<value><數(shù)字> <unit>::=|OHM|K|KOHM|M|MOHM <char>::=<數(shù)字>|<字母>2.3vi2.3.1vi概述文本編輯器與vi UNIX最基本的文本編輯器是ed。ed是面向行文本的編輯器,其用戶界面功能很弱,使用時看不到上下文。對用戶來說,使用起來很不方便。但是在操作系統(tǒng)的開發(fā)和安裝階段,在還沒有安裝圖形界面的時候,只有ed可以工作,因此ed通常是系統(tǒng)開發(fā)者和管理員所必須熟悉和掌握的編輯工具。另外,由于ed提供了此后開發(fā)的各種編輯工具中最底層的編輯函數(shù),這對于學習各種編輯工具時理解許多具有共性的操作很有幫助。 由比爾·喬伊(BillJoy)始創(chuàng)的vi(Visualdisplayeditor,全屏幕編輯器)是UNIX中最常用的全屏幕文本編輯器。vi可在看到上下文的同時面向字符進行編輯。由于vi與ex(ed的超集)相互鏈接,可以相互轉(zhuǎn)換使用,使得vi匯集了行編輯和全屏編輯的特點,成為使用UNIX首選的文本編輯器。 vim(作者BramMoolenaar布萊姆?莫利納羅)和emacs(作者RichardStallman,理查?斯托曼)。vi的工作方式 UNIX中把分隔文字為逐行的回車符(換行符)也視為字符,因此文件被認為是連續(xù)的文字流(字符流),通常存放在外存(硬盤等介質(zhì))中。vi的工作方式是從外存讀入文本文件存入內(nèi)存的編輯工作區(qū)(緩沖區(qū))進行編輯,編輯完成后再將緩沖區(qū)的文件存放到硬盤。vi的輸入 讀文件:讀取外存(通常是硬盤)中的外部文件到內(nèi)存的編輯工作區(qū)。vi的編輯操作 在工作區(qū)編輯文件。vi的輸出 存文件或者另存文件:將文件輸出到外存(通常是硬盤)。啟動vi的方式 vi[file [...]] 對0到多個文件file進行編輯 例如,vi 編輯一個無名文件(空文件) 例如,via.txt 編輯一個文件a.txt 例如,via.txtb.txt 編輯兩個文件a.txt和b.txt啟動vi示例 在shell狀態(tài)的命令行中,執(zhí)行命令: $via.txt 將刷新shell狀態(tài)的窗口,轉(zhuǎn)為顯示vi窗口。編輯已有的文件 如果a.txt是非空文件,在shell狀態(tài)下執(zhí)行命令: $via.txt 將啟動vi,刷新shell狀態(tài)的窗口,轉(zhuǎn)為顯示vi窗口。讀入文件a.txt,并在窗口中顯示文件的內(nèi)容,窗口中的第一行行首為光標。如果文件內(nèi)容少于窗口高度,則余下行顯示~(tidle,代字符),表示空行。底行為文件信息,例如: "a.txt"3lines,34characters 通過對終端特性的設(shè)置,可以選擇光標采用塊狀或者下劃線形式。還可以選擇是否閃爍。編輯一個空文件 如果在shell狀態(tài)下執(zhí)行命令: $vi 編輯無名文件 或者 $viabc 編輯新文件abc shell狀態(tài)的窗口將刷新為vi的空白窗口,左側(cè)一列顯示~,表示空行。第一行行首將顯示光標。如果指定文件,則顯示文件名及[Newfile]。如果編輯無名文件,則可能顯示幫助信息。2.3.2vi的工作狀態(tài)/模式 所有的ASCII字符都是vi的命令,也就是說,至少有100多條命令,包括字母數(shù)字、標點符號、以及各種控制字符,而且大寫字母與小寫字母分別代表不同的命令。因此在vi中不要隨意按鍵。vi的工作狀態(tài)及工作模式 vi有三種工作狀態(tài),vi狀態(tài)、ex狀態(tài)以及open狀態(tài)。open狀態(tài)不常用,因此不予介紹。vi狀態(tài)有兩種工作模式,vi狀態(tài)的命令模式和vi狀態(tài)的插入模式,簡稱命令模式和插入模式。命令模式 啟動vi后總是先處于命令模式。在命令模式中,沒有待命符,不能直接輸入文件的內(nèi)容。鍵入的字符均視為命令,不顯示,而只是執(zhí)行。 可以從命令模式轉(zhuǎn)換為插入模式或者ex狀態(tài)。插入模式 在命令模式中使用插入類命令,將轉(zhuǎn)入插入模式,隨后鍵入的字符(文本)才是文件的內(nèi)容(以下用下劃線表示)。插入文本完畢,必須按<ESC>回到命令模式。ex狀態(tài) ex狀態(tài),又可稱為ex模式或者底行模式。 從shell中啟動ex,即 $ex[file [...]] “$”是shell的待命符 將進入ex狀態(tài)。 在命令模式中按Q鍵,可從vi狀態(tài)(的命令模式)轉(zhuǎn)到ex狀態(tài)。 ex狀態(tài)的特征是在vi窗口的底行顯示待命符“:”。 執(zhí)行ex命令的完整形式為: :ex命令<CR> 以回車鍵表示結(jié)束 可以在vi狀態(tài)(的命令模式)中按“:ex命令<CR>”,執(zhí)行一個ex命令。 在ex狀態(tài)中鍵入 :vi<CR> “:”是ex的待命符 將從ex狀態(tài)轉(zhuǎn)到vi狀態(tài)(的命令模式)。 可見,vi狀態(tài)和ex狀態(tài)可以相互轉(zhuǎn)換,但僅限于命令模式與ex狀態(tài)之間的相互轉(zhuǎn)換。vi工作狀態(tài)/模式的轉(zhuǎn)換vi狀態(tài)的命令模式 用插入類命令(a,i,o等命令)進入插入模式。 按Q鍵轉(zhuǎn)到ex模式。 按“:ex命令<CR>”,執(zhí)行一個ex命令。vi狀態(tài)的插入模式 插入文本后,按<ESC>鍵回到命令模式。ex狀態(tài)/ex模式 按vi<CR>轉(zhuǎn)到命令模式。寫文件命令 :w<CR> 將當前文件存盤 :w□file<CR> 將當前文件另存為file :w!□file<CR> 另存為一個已存在的file(強制覆蓋file)退出vi的命令 :q<CR> 已存盤或者沒有修改文件時退出vi :q!<CR> 放棄所作的修改,退出vi :wq<CR> 存盤并且退出vi ZZ 存盤并且退出vi(不需要回車)讀文件命令 :e□file<CR> 讀入文件file,作為當前的編輯文件。 :[n]r□file<CR> 讀入文件file,插在第n行之下。n為0表示插在 第0行之下(文件開頭),省略n表示當前行。 :[n]r!command<CR> 執(zhí)行shell命令command,將運行結(jié)果插在第n 行之下。n的含義同上。 :n<CR> 如果使用命令“vifile1file2...”啟動vi,表示編輯多 個文本文件,n表示編輯下一文件(nextfile)。2.3.3編輯對象及定位vi編輯的對象字符(由光標位置確定) 當前字符(光標所在位置),前一字符,后一字符,文件首,文件尾,行首,行尾詞word 由字母、數(shù)字和下劃線組成,或者由標點符號組成。詞WORD 由非空字符組成,空字符作為WORD的分隔符。 例如: 2004_Mar_1 表示1個word,或者1個WORD 2004-Mar-1 表示5個word,或者1個WORD %d%d,n,m 表示8個word,或者1個WORD %d+->%d12 表示4個word,或者1個WORD結(jié)合詞 詞首,詞尾,前n個詞,后n個詞。行 當前行,上一行,下一行,首行(文件第一行),尾行(文件最后一行),第n行。文件 當前(正在編輯的)文件,輸入文件,輸出文件,下一文件。定位命令按字符移動光標 h或者←鍵: 向左移動一格 l或者→鍵: 向右移動一格 k或者↑鍵: 移到上一行同一格,若上一行短,則移到行尾 j或者↓鍵: 移到下一行同一格,若下一行短,則移到行尾按詞(word/WORD)移動光標 w: 向后移到下一個word首 W: 向后移到下一個WORD首 b: 向前移到前一個word首 B: 向前移到前一個WORD首 e: 向后移到下一個word尾 E: 向后移到下一個WORD尾行內(nèi)移動光標 ^: 移到本行第一個非空字符 0: 移到本行第一個字符(包括空字符) $:移到本行行尾(最后一個字符)跨行移動光標 <CR>: 移到下一行首 ^F或^f:向下翻頁 ^B或^b:向上翻頁 G: 移到最后一行 1G:移到第一行2.3.4編輯類命令插入類命令插入類命令的用法 <插入類命令>插入內(nèi)容<ESC> <插入類命令>和<ESC>是不顯示的,插入內(nèi)容是用戶鍵入的。插入類命令 i 在當前字符前插入 I 在行首插入 a 在當前字符后插入 A 在行尾插入 o 在當前行以下插入 O 在當前行以上插入【例2-5】插入類命令示例插入前插入命令及插入內(nèi)容插入后howareyouiGood⊕thank!<ESC>i命令: 在當前字符前插入Goodthank!howareyouhowareyouiGood⊕thank!⊕<ESC>i命令: 在當前字符前插入Goodthank!howareyouhowareyouaGood⊕thank!<ESC>a命令: 在當前字符后插入hGoodthank!owareyouhowareyouoGood⊕thank!<ESC>o命令: 在當前行以下插入howareyouGoodthank!howareyouOGood⊕thank!<ESC>O命令: 在當前行以上插入Goodthank!howareyou替代類命令:s,cw,cW,c$,C和cc均以<ESC>為結(jié)束符。 rx 將當前字符替換為x,r命令不需要<ESC> [n]s 將n個字符替換為插入內(nèi)容,n缺省為1 cw 或cW 將當前字符到word/WORD尾替換為插入內(nèi)容 c$或C 將當前字符到行尾的內(nèi)容替換為插入內(nèi)容 cc 將當前行替換為插入內(nèi)容【例2-6】替代命令示例替換前替換命令及作用替換后May-1OK?rr或者sr<ESC>將當前字符y改為rMar-1OK?May-1OK?cWr-20<ESC>將y-1改為r-20Mar-20OK?May-1OK?c$r-20right?<ESC>或者Cr-20right?<ESC>將y-1OK?改為r-20right?Mar-20-right?May-1OK?ccBuy!⊕Doit!<ESC>將當前行改為兩行Buy!Doit!刪除類命令刪除字符的命令 [n]x 刪除n個字符,n缺省為1 d[n]w 刪除n個word,n缺省為1 d[n]W 刪除n個WORD,n缺省為1 d$ 刪除到行尾【例2-7】刪除字符命令示例刪除前刪除命令及作用刪除后is2005-May-1OK?x 刪除當前字符yis2005-Ma-1OK?is2005-May-1OK?5x 刪除5個字符“y-1O”is2005-MaK?is2005-May-1OK?d2w 刪除2個word“y-”is2005-Ma1OK?is2005-May-1OK?dW 刪除WORD“y-1”is2005-MaOK?is2005-May-1OK?d$ 刪除到行尾is2005-Ma行刪除命令 dd 刪除當前行 [n]dd 刪除包括當前行在內(nèi)的以下n行,n缺省為1 :[i[,j]]d<CR> 刪除第i行至第j行,省略j刪除第i行【例2-8】行刪除命令示例刪除前刪除命令及作用刪除后howareyouGoodthank!Byedd刪除第2行(當前行)howareyouthank!ByehowareyouGoodthank!Bye3dd向下刪除3行howareyouhowareyouGoodthank!Bye:2,3d<CR>刪除第2行和第3行howareyouBye2.3.5全局操作命令搜索命令/[str][/]<CR> 從當前字符起向下搜索匹配str的字符串。向下搜索遇到文件尾時將自動接著從文件首繼續(xù),直到當前字符。?[str][?]<CR> 從當前字符起向上搜索匹配str的字符串。向上搜索遇到文件首時將自動接著從文件尾繼續(xù),直到當前字符。 以上命令中的第二個斜杠和問號可以省略。若不是第一次搜索,可省略str。N 反向搜索strn 按前一次的搜索方向再一次搜索str正則表達式 以上匹配str的字符串可以有多種表述方式,稱為正則表達式:. 除了換行符,可以替代任何一個字符的通配符。[xyz] 方括號中用xyz的枚舉方式表述的一個字符的通配符。方括號是必需的符號。枚舉方式可以采用a-b的形式,表示按照ASCII的順序從字符a到b之間的任何一個字符,例如,[0-9]表示一個數(shù)字,[0-9_]表示一個數(shù)字或者下劃線。x* 字符x的0到多次重復(fù),x代表用以上任何一種表述的一個字符。例如a*可以匹配aaa和a等。^ 不表示一個實際的字符,僅代表行首。例如,^Lead表示匹配位于行首的字符串Lead。$ 不表示一個實際的字符,僅代表行尾。例如,Tail$表示匹配位于行尾的字符串Tail。而^$表示空行,表示在行首和行尾之間沒有字符。\c 如果c是特殊字符(如.和*等),需用反斜杠\轉(zhuǎn)義。例如,匹配特殊字符.(dot),\,/和*時應(yīng)該表述為\.,\/,\\和\*。 以下無名宏和有名宏的使用見“s命令”。& 搜索字符串str總會保存在vi的搜索緩沖區(qū)內(nèi),并且可以用符號&表示引用。這種引用緩沖區(qū)的方式稱為無名宏。\(字符串\) 將\(和\)之間的字符串定義為有名宏。允許定義多個有名宏,相當于一個有名緩沖區(qū)保存一個有名宏。\d d是一個數(shù)字,按照有名宏定義的順序,用\1、\2等引用相應(yīng)的有名宏。例如,在str中定義了三個有名宏,則在引用時它們依次為\1、\2和\3。d命令 d命令即行刪除命令(deleteline),基本格式為: :[g[!]][/pattern/]d<CR> (關(guān)于/pattern/的格式參見sed命令) d命令的格式 :/pattern/d<CR> 刪除第一個匹配pattern的行 :g/pattern/d<CR> 刪除所有匹配pattern的行 :g!/pattern/d<CR> 刪除所有不匹配pattern的行 /pattern/用以描述需要刪除的范圍(又稱行地址address),格式為: addr1 匹配addr1的行 addr1,addr2 從匹配addr1到匹配addr2之間的行 省略/pattern/ 刪除當前行【例2-9】d命令示例 :/The/d<CR> 刪除第一個含字符串The的行 :g/[0-9]/d<CR> 刪除所有含有數(shù)字的行 :g!/[a-z]/d<CR> 刪除所有不含小寫字母的行 :/Start/,/End/d<CR> 刪除從含有Start到含有End的行 :g/^#/d<CR> 刪除所有行首為#的行(shell的注釋行) :g/\/\*/d<CR> 刪除所有含/*(特殊字符)的行(C語言注釋行) :g/^$/d<CR> 刪除所有空行(在^和$之間沒有字符) :$d<CR> 刪除最后一行,這里$表示最后一行 :/^#/,$d<CR> 從第一個shell注釋行刪除到最后一行s命令 s命令即行替換命令(linesubstitute),基本格式為: :[[g]/pattern/]s/[str]/new_str/[cmd]<CR> s命令的格式::/pattern/s/str/new_str/⊕ 尋找匹配pattern的行,將匹配str的字符串替換為新的字符串new_str(只替換該行中的第一個str)。:g/pattern/s/str/new_str/⊕ 尋找所有匹配pattern的行,將str替換為new_str。:/pattern/s//new_str/⊕ 表示str與pattern相同,即尋找pattern,用new_str替換pattern。:s//new_str/<CR> 表示str與前一次搜索的字符串相同(字符串存在搜索緩沖區(qū)中)。:g//s//new_str/<CR> 尋找所有pattern,用new_str替換pattern。輔助命令(輔助功能) 在s命令“:[[g]/pattern/]s/[str]/new_str/[cmd]<CR>”中含有cmd。 用cmd表示s命令的輔助功能,包括:g 在匹配pattern的行內(nèi)替換所有匹配str的字符串p 顯示最后一個替換的行g(shù)p 替換所有匹配str的字符串,并顯示所有替換過的行【例2-10】s命令示例:/if□[/⊕ 尋找“if□[”:g//s//if□(/g⊕ 在所有行中用“if□(”替換所有的“if□[” 等價為:g/if□[/s//if□(/g⊕:3,50s/ABC/123/ 在第3行到第50行中用123替換一個ABC:3,50s/ABC/123/gp 在第3行到第50行中用123替換所有的ABC,并且顯示所有被替換的行【例2-11】無名宏示例 要求在C程序中將輸出從stdout改為stderr,即所有的“printf(”需要改為“fprintf(stderr,”,操作如下: :g/printf(/s//f&stderr,/<CR> 表示用無名宏&引用搜索緩沖區(qū)中的“printf(”【例2-12】有名宏示例 用有名宏完成上例的操作: :g/\(printf(\)/s//f\1stderr,/<CR> 表示用\(和\)定義“printf(”為有名宏,\1表示引用“printf(”。 要求將文件中含有以字母開頭后綴為.c的字符串(C程序的文件名)改為后綴為.cpp的字符串(C++的文件名),操作如下: :g/\([_A-Za-z0-9]*\)\.\(c\)/s//\1.\2pp/g<CR> 其中,用\(和\)將文件前綴“[_A-Za-z0-9]*”定義為有名宏1,用\(和\)將“c”定義為有名宏2,然后分別用\1和\2引用有名宏。2.3.6塊操作命令塊操作概述 vi提供三個基本的動作:pick(拾取),cut(剪取)和put(粘貼)。由此完成按塊(block)進行復(fù)制(copy)和移動(move)的功能。 其中,copy=pick+put,move=cut+put。 以字符(char)、詞(word或WORD)為單位或者以行(line)為單位均可組成塊。一個無名緩沖區(qū)用來存放無名塊,若干個有名緩沖區(qū)用來存放用戶定義的有名塊。vi塊操作命令 pick: [”x][n]yw或者[”x][n]yW 復(fù)制n個詞(word或WORD)存入存入緩沖區(qū)。 pick: [”x][n]yy 復(fù)制含當前行在內(nèi)的n行存入緩沖區(qū)。 cut: [”x][n]dd 剪取含當前行在內(nèi)的n行存入緩沖區(qū)。 其中,y是yank(移出)的縮寫。n缺省為1。字符x表示定義有名緩沖區(qū),省略x表示存取無名緩沖區(qū)。已經(jīng)介紹過的刪除類命令都可以作為剪取命令。 put: [”x]p或者[”x]P 粘貼緩沖區(qū)內(nèi)容 若塊的內(nèi)容以行為單位,則向下(p)或者向上(P)粘貼。 若塊的內(nèi)容以字符為單位,則向右(p)或者向左(P)粘貼。ex塊操作命令 copy: :i[,j]cok<CR> 將第i行到第j行復(fù)制到第k行之下。 move: :i[,j]mk<CR> 將第i行到第j行移到第k行之下。 其中,省略j表示只對第i行實施復(fù)制或者移動?!纠?-13】塊操作命令示例 將第2行的you復(fù)制到第1行的問號前,操作過程為: yw/?/⊕Phoware?thank□you.goodbye!~~=>howare?thank□you.goodbye!~~=>howareyou?thank□you.goodbye!~~待編輯文本執(zhí)行yw/?/⊕后執(zhí)行P命令后 將第2行移到第3行(本行與下一行交換),操作過程為 ⊕ddphowareyou?thank□you.goodbye!~~=>howareyou?goodbye!~~~=>howareyou?goodbye!thank□you.~~待編輯文本執(zhí)行⊕dd后執(zhí)行p命令后 將當前行(第3行)復(fù)制到第1行,操作過程為 yy1GPhowareyou?goodbye!thank□you.~~=>howareyou?goodbye!thank□you.~~=>thank□you.howareyou?goodbye!thank□you.~待編輯文本執(zhí)行yy1G后執(zhí)行P命令后 利用有名緩沖區(qū)將“thank”復(fù)制到第3行行尾,操作過程為 ”ayw⊕⊕$”apthank□you.howareyou?goodbye!thank□you.~=>thank□you.howareyou?goodbye!thank□you.~=>thank□you.howareyou?goodbye!thankthank□you.~待編輯文本執(zhí)行”ayw⊕⊕$后執(zhí)行”ap命令后2.3.7雜類命令 . 重復(fù)執(zhí)行編輯類命令(插入、刪除和替代命令) u 撤消剛才執(zhí)行的編輯類命令,^r 恢復(fù)剛才撤消的命令。 J 將下一行連到本行尾,等價于將換行符改為空格。 ^L 控制鍵CRTL+L,刷新屏幕。 :sh<CR> 轉(zhuǎn)到shell狀態(tài),將顯示shell的待命符,以便執(zhí)行sh

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論