1第3章Linux的文本编辑工具VI3.1vi文本编辑器概述与Unix相同,Linux本质上是一个文本驱动(text-driven)的操作系统。文本文件就是全部由ASCII码字符及某种语言的编码字符构成的文件,不含有任何样式和格式信息。文本文件可以被任何文本编辑器解释而不会出现乱码,还可以被所有程序操作和使用。在Linux系统中,文本文件被广泛地用作系统配置文件和系统工具软件的操作对象。这使得用户可以在文本方式下完成所有的工作,如编写程序和命令脚本、读/写电子邮件、配置和管理系统等。而完成所有这些工作的基本工具就是文本编辑器。因此,Linux的用户应当熟悉至少一种文本编辑器。3.1.1vi文本编辑器介绍Linux下的文本编辑器有ex、sed、vi和emacs等很多种。其中,vi是最基本的文本编辑工具。vi(visual)诞生于1978年,由柏克莱大学的BillJoy编写。从其诞生至今,vi始终是所有Unix/Linux系统上必配的编辑器,甚至在DOS、Windows、Macintosh、OS/2乃至IBM大型机S/390系统上都能见到vi的某个版本。目前Linux系统上流行的版本是vi增强版vim(viimproved)。vim是一个开放源代码软件,它在vi的基础上增强了功能,也更容易使用。现在许多Linux发行版中的vi就是vim。3.1.1vi文本编辑器介绍vi是一个全屏幕文本编辑器,具有文本编辑所需的所有功能。vi以高效和快捷著称,这是vi能够在编辑器领域中保持几十年领先地位的原因。以下介绍vi的几个突出特点3.1.1vi文本编辑器介绍1.编辑功能强大vi的编辑功能十分强大,除通常的编辑功能外,vi还支持一些高级编辑特性,如正则表达式、宏和命令脚本。利用这些特性可以完成非常复杂的编辑任务,实现编辑的智能化和自动化。另一方面,vi的功能又十分专注,它只是一个编辑器,没有其他功能。Linux系统提供了许多专门用途的工具,如排版、排序、流过滤、E-mail、编译等软件。vi可以和这些工具软件协同工作,从而实现几乎所有的文件加工处理任务。用一些小而精悍、功能专一的工具结合起来完成复杂的处理功能,这正是Unix的设计哲学。3.1.1vi文本编辑器介绍2.适用于各种版本的Unix/Linux系统vi是Unix/Linux系统的标准文本编辑器,几乎每一台Unix/Linux系统上都会有vi,这是其他编辑器无法相比的。3.适用于各种类型的终端vi得以广泛应用的原因之一是它对终端设备的广泛适应性。不管是只有打字机键盘加Esc键的简单终端,还是受通信限制的远程终端,或是配有完备的功能键和鼠标的现代化终端,都可以很好地支持vi完成文本编辑工作。3.1.1vi文本编辑器介绍4.使用灵活快捷广泛适应性带来的问题是繁多的命令。对于同一项编辑操作,vi提供了许多不同的命令。vi的命令都很简练,往往是单个字符或少数几个字符的组合。对初学者来说,使用这些命令并不方便,甚至过于复杂。但对于熟练的用户来说,更多的选择意味着更大的自由,简单的命令意味着更少的击键次数。正因为如此,vi被看做是Linux开发人员和系统管理员的编辑利器。初学者经过一段时间的使用,也会逐渐习惯vi的操作方式,并形成自己特有的操作风格。3.1.2vi的工作模式vi是一个多模式的软件,它有三种工作模式。在不同的工作模式下,它对输入的内容有不同的解释。1.命令模式(Commandmode)在命令模式下,输入的任何字符都作为命令来解释执行,屏幕上不显示输入内容。命令模式用于完成各种文本修改工作。2.输入模式(Insertmode)在输入模式下,输入的任何字符都将作为文件的内容被保存,并显示在屏幕上。输入模式用于完成文本录入工作。3.1.2vi的工作模式3.末行模式(Lastlinemode)--底行模式末行模式也称为ex转义模式。在末行模式下,光标停留在屏幕的最末行,在此接收输入的命令并执行。末行模式用于执行一些全局性操作,如文件操作、参数设置、查找与替换、拷贝与粘贴、执行Shell命令等。在文本编辑过程中,用户可以控制vi在这三种工作模式之间进行切换,完成各种编辑工作。三种模式之间的转换关系如图3-1所示。3.1.2vi的工作模式图3-1vi工作模式的转换AaIiOo:/?3.1.3vi的启动与退出在Shell下输入vi命令后,便进入全屏幕编辑环境命令格式是:vi[文件名][+n][+/str]保存与退出:w--保存但不退出:w文件名--另存为:wq--保存后退出;q!--不保存退出:q--未编辑,直接退出,编辑过则提示但不退出常用命令介绍文本插入命令a--在当前光标后插入字符A--在行尾插入i--在当前光标前插入字符I--在行首插入o--在当前行的下一行插入新行O--在当前行的上一行插入新行常用命令介绍移动光标命令hjkl--左、下、上、右移动光标,相当于光标键的作用。bBwWeE--以单词为单位移动光标()--以句为单位移动光标{}--以段为单位移动光标^f^b--前后翻页(^f--pagedown^b--pageup)0$--移动光标到行首(0)或行尾($)nG--移动光标到第n行(1G--到文本首行,1G==gg)G--光标移到文本末行常用命令介绍删除文本命令x--删除当前光标位置的字符(del)nx--删除n个字符X--删除当前光标前的字符(backspace)nXdd--删除当前行(ndd--删除当前行开始的n行)D--删除光标位置到行尾之间的字符(删后半行)d0--删除光标位置到行首之间的字符(删前半行)注:删除的内容均进入剪贴板合并行命令J--将光标所在行的下一行合并到当前行常用命令介绍替换(改写)文本命令r--用随后输入的一个字符替换当前字符R--用随后输入的字符替换光标位置开始的若干字符,每输入一个字符就替换一个原有字符,直到按Esc键。(相当于进入改写状态)s--用随后输入的一个或多字符替换当前光标位置的一个字符,若只输入一个则与r命令相同。S--用新输入的内容替换当前行(不管光标在行中何处)常用命令介绍查找字符串命令/str--从光标处往后搜索字符串str?str--从光标处往前搜索字符串strn--在执行以上查找命令的基础上继续搜索下一个strN--在执行以上查找命令的基础上反向搜索下一个str常用命令介绍查找替换命令:m,ns/str1/str2/g[c]--将第m行与第n行之间的所有str1替换成str2,如果后面是g,则自动替换(替换前不提示),如果后面为c,则每次替换前均要提示是否替换。例如::4,15s/str1/str2/g--自动替换第4行到第15行中的str1:s/str1/str2/g--只替换当前行中的str1:%s/str1/str2/g--替换所有行中的str1,等价于:1,$s/str1/str2/g常用命令介绍文本选择v--进入按字选择模式:上下左右移动光标进行文本选择(可任意选择)V--进入按行选择模式:上下移动光标进行文本行的选择(只能选择若干行)常用命令介绍剪切命令d--剪切选定的内容至剪贴板dd--剪切当前行至剪贴板复制命令y--复制选定的内容至剪贴板yy--复制当前行至剪贴板粘贴命令p--将剪切板中的内容粘贴到下一行(或当前光标之前)P--将剪切板中的内容粘贴到上一行(或当前光标之后)高级用法提示-使用多个剪切板的方法:在使用剪切或复制命令前先按小写字母,便可将相应的内容剪切或复制到小写字母对应的剪贴板中,在粘贴命令前用小写字母便可将指定的剪贴板中的内容粘帖到相应的位置。如adbddcydyycpbP常用命令介绍部分底行命令:setai/noai--设置/取消自动缩进:setnu/nonu--设置/取消行号显示:sethlsearch/nohlsearch--设置/取消高亮显示搜索到的字符串:n--跳转到第n行:n1,n2con3--将第n1至n2之间的行复制到第n3行下面。:n1,n2mn3--将第n1至n2之间的行移动到第n3行下面。:n1,n2d--删除第n1至n2之间的行习题3-1vi编辑器的工作方式有哪些?相互之间如何转换?3-2简述Linux下的复制与粘贴操作。3-3要将文件中的所有字符串str1全部用字符串str2替换,应使用什么命令?若只将8-15行中的str1替换为str2,又应使用什么命令?3-4如何在vi中显示文本的行号?3-5如何保存编辑过的文件并退出?如何放弃对一个文件的修改并退出?如何实现另存为?