Chinaunix首页 | 论坛 | 博客
  • 博客访问: 369246
  • 博文数量: 146
  • 博客积分: 2990
  • 博客等级: 少校
  • 技术积分: 1399
  • 用 户 组: 普通用户
  • 注册时间: 2009-03-09 22:09
文章分类

全部博文(146)

文章存档

2011年(1)

2010年(2)

2009年(143)

我的朋友

分类: LINUX

2009-03-12 21:09:54

一、简介
Vi命令可以说是Unix/Linux世界里最常用的编辑文件的命令了,很多人不喜欢VI因为它的众多的命令集,但是我们只需要掌握基本的命令然后灵活地加以运用,相信你会象我一样喜欢它的。 本文旨在更有条理有归纳性地介绍VI的一些最常用命令和一些高级的应用。
二、基本命令介绍
1) 光标命令
k,j,h,l——上下左右光标移动命令,虽然你可以在Linux中使用键盘右边的四个光标键, 但是记住这四个命令还有非常有用的,也就是右手在键盘上放置的位置部分。
nG ——n为行数,该命令立即使光标跳到指定行。
Ctrl+G——光标所在位置的行数和列数报告。
w,b——使光标向前或向后跳过一个单词。
2) 编辑命令
i,a,r——在光标的前,后,上方插入字符命令(i=insert,a=append,r=replace)。
cw,dw——改变(置换)/删除光标所在处的单词的命令 (c=change,d=delete)。
x,d$,dd——删除一个字符,光标所在处到行尾的所有字符,和整行的命令。
3) 查找命令
/string,string——从光标所在处向后/向前查找相应的字符串的命令。
4)拷贝复制命令
yy,p ——拷贝一行到剪贴板/取出剪贴板中内容的命令。
5) a命令
该命令用于在光标当前所在位置之后追加新文本。新输入的文本放在光标之后,在光标后的原文本将相应地向后移动。光标可在一行的任何位置。
6) A命令
该命令与a命令不同的是,A命令将把光标挪到所在行的行尾,从那里开始插入新文本。当输入A命令后,光标自动移到该行的行尾。
7)o命令
 该命令将在光标所在行的下面新开一行,并将光标置于该行的行首,等待输入文本。
8)O命令
和o命令相反,O命令是在光标所在行的上面插入一行,并将光标置于该行的行首,等待输入文本。
三、 文本修改
在命令模式下可以使用Vi提供的各种有关命令对文本进行修改,包括对文本内容的删除、复制、取代和替换等。  
文本删除
 在编辑文本时,经常需要删除一些不需要的文本,我们可以用键将输错或不需要的文本删除,但此时有一个限制就是当删到行头之后,再想删上面那行的内容是不可能的。
在命令模式下,Vi提供了许多删除命令。这些命令大多是以d开头的。常用的有:
1. 删除单个字符
x: 删除光标处的字符。若在x之前加上一个数字n,则删除从光标所在位置开始向右的n个字符。
  
  X:删除光标前面的那个字符。若在X之前加上一个数字n,则删除从光标前面那个字符开始向左的n个字符。
 显然这两个命令是删除少量字符的快捷方法。
 2. 删除多个字符
 dd:删除光标所在的整行。在dd前可加上一个数字n,表示删除当前行及其后n-1行的内容。
D或d$:两命令功能一样,都是删除从光标所在处开始到行尾的内容。
 d0:删除从光标前一个字符开始到行首的内容。
  dw:删除一个单词。若光标处在某个词的中间,则从光标所在位置开始删至词尾。同dd命令一样,可在dw之前加一个数字n,表示删除n个指定的单词。
 如果用户不小心进行了误删除操作,也不要紧,Vi提供了恢复误操作的命令,并且可以将恢复的内容移动,放在文本的任何地方。恢复命令用² np,其中n为寄存器号。这是因为Vi内部有9个用于维护删除操作的寄存器,分别用数字1,2,¼ ,9表示,它们分别保存以往用dd命令删除的内容。这些寄存器组成一个队列,例如最近一次使用dd命令删除的内容被放到寄存器1中;当下次再使用dd命令删除文本内容时,Vi将把寄存器1的内容转存到寄存器2中,而寄存器1中又将是最近一次dd命令删除的内容。以此类推,Vi可以保存有最近九次用dd命令删除的内容,而前面的用dd命令删除的内容则被抛弃。
  [例18] 假设当前编辑文件为xu.c
    /* this is a example */
    #include
    void main( )
    {
    int i , j ;
    printf( “ please input a number : / n ” );
    scanf ( “ % d ” , &i ) ;
    j = i + 100 ;
    printf ( “ /n j = % d /n ” , j ) ;
    return ;
    }
 我们对其进行如下操作:
 将光标移至文件第一行,按dd命令,此时文件第一行的内容被删除,且被删除的内容保存在寄存器1中;
 按5j使光标下移至第一个printf语句行;
 按dd命令将该行删除,此时寄存器1中将保存刚刚被删除的内容:
   printf (“ please input a number :\ n ” );
 而寄存器1原有的内容:
    /* this is a example */
  则被保存到寄存器2中;
 在最末行模式下,也可以对文件内容进行删除,但它只能删除整行,一次可将某个指定范围内(起始行号,终止行号)的所有行全部删除。需要注意的是,用此种方法进行删除时,Vi并不把所删内容放入寄存器中,因而当发生误删除操作时,不能用² np命令恢复,只能用u命令进行有限的恢复。
  最后提一下,如何在文本输入方式时将所输入文本删除。用户使用组合键即可,此时光标将返回插入开始的位置,并且Vi仍处于文本输入方式。
  取消上一命令(Undo)
 取消上一命令(Undo),也称复原命令,是非常有用的命令,它可以取消前一次的误操作或不合适的操作对文件造成的影响,使之回复到这种误操作或不合适操作被执行之前的状态。
  取消上一命令有两种形式,在命令模式下键入字符u和U。它们的功能都是取消刚才输入的命令,恢复到原来的情况。小写u和大写U在具体细节上有所不同,二者的区别在于,大写U命令的功能是恢复到误操作命令前的情况,即如果插入命令后使用U命令,就删除刚刚插入的内容;如果删除命令后使用U命令,就相当于在光标处又插入刚刚删除的内容。这里把所有修改文本的命令都视为插入命令。也就是说,U命令只能取消前一步操作,如果用U命令撤消了前一步操作,当再按U键时,并不是撤消再前一步的操作,而是撤消了刚才U命令执行的操作,也就是又恢复到第一次使用U命令之前的状态,结果是什么都没做。而小写u命令的功能是把当前行恢复成被编辑前的状态,而不管此行被编辑了多少次。
  [例19] 原来屏幕显示内容为:
  #include
    main ( )
    {
    }
 命令模式下输入命令o,插入一新行,输入需要插入的内容后再按回到命令模式,屏幕显示内容为:
    #include
    main ( )
    {
    printf ( “ How do you do ! ” ) ;
    }
 若想取消这一插入操作,请按命令U后,屏幕恢复到原来显示的情况。
注意:对于取消命令仍可以再使用取消命令。这时会产生一种“负负得正”的效果,文件状态将恢复到第一次执行取消命令之前的状态,如同没做任何操作一般。例如在上例中,再使用一次命令U,屏幕将显示的内容仍为插入后的内容。
 重复命令(Redo)
重复命令也是一个非常常用的命令。在文本编辑中经常会碰到需要机械地重复一些操作,这时就需要用到重复命令。它可以让用户方便地再执行一次前面刚完成的某个复杂的命令。
 重复命令只能在命令模式下工作,在该模式下按“.”键既可。执行一个重复命令时,其结果是依赖于光标当前位置的。
    [例20] 屏幕显示内容为:
    #include
   main ( )
    {
    }
 输入命令o,并输入一行内容后,再< Esc >返回到命令模式下,屏幕显示内容为:
    #include
    main ( )
    {
    printf ( “ How do you do ! ” ) ;
    }
 此时输入命令“.”,屏幕显示内容为:
    #include
    main ( )
    {
    printf ( “ How do you do ! ” ) ;
    printf ( “ How do you do ! ” ) ;

三、常见问题及应用技巧

1) 在一个新文件中读/etc/passwd中的内容,取出用户名部分
vi file
:r /etc/passwd 在打开的文件file中光标所在处读入/etc/passwd。
:%s/:.*//g 删除/etc/passwd中用户名后面的从冒号开始直到行尾的所有部分。
:3r /etc/passwd 这是在指定的行号后面读入文件内容。
另外一种方法删掉文件中所有的空行及以#开始的注释行。
#cat squid.conf.default | grep -v '^$' | grep -v '^#'
2) 在打开一个文件编辑后才知道登录的用户对该文件没有写权,不能存盘。
vi file
:w /tmp/1 既然没法存盘,不想放弃所做的所有修改,先临时存到/tmp/1。
:20,59w /tmp/1 或者仅仅把第20到59行之间的内容存盘成文件/tmp/1。
3) 用VI编辑一个文件,但需要删除大段大段的内容。
vi file
Ctrl+G 把光标移到需要删除的行的处按ctrl+G显示行号,再到结尾处再按Ctrl+G。
:23,1045d 假定两次行号为23和1045,则把这几间的内容全删除。 也可以在开始和结束两行中用ma,mb命令标记后用:'a,'bd删除。
4) 在整个文件或某几行中在行首或行尾加一些字符串
vi file
:3,$s/^/some string /
在文件的第一行至最后一行的行首前插入some string。
:%s/$/ some string/g 在整个文件每一行的行尾添加 some string。
:%s/string1/string2/g 在整个文件中替换string1成string2。
:3,7s/string1/string2/ 仅替换文件中的第三到七行中的string1成string2。
Note: s为substitute,%表示所有行,g表示global。
5) 同时编辑两个文件,在两个文件中拷贝剪贴文本
vi file1 file2
yy 同时打开两个文件,在文件1的光标所在处拷贝所在行。
:n 切换到文件2 (n=next)。
p 在文件2的光标所在处粘贴所拷贝的行。
:N 切换回文件1。
6) 替换文件中的路径
:%s#/usr/bin#/bin#g 把文件中所有路径/usr/bin换成/bin。或者用:%s/\/usr\/bin/\/bin/g 在'/'前用\符号指出'/'是真的单个字符'/'。
阅读(3530) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~