vi

来源:互联网 发布:黑屏手机 数据导出 编辑:程序博客网 时间:2024/06/12 01:40

vi是所有Unix及Linux系统下标准的编辑器。

1、vi的基本概念  

  vi可以分为三种状态:

     命令模式(command mode)

     插入模式(Insert mode)

     底行模式(last line mode)


各模式的功能区分如下:

1) 命令行模式(command mode)

        [redhat@localhost ~]$ vi hello.c
        这时进入的是命令行模式,控制屏幕光标的移动,字符、字或行的删除,移动复制某区段及进入Insert mode下,或者到 last line mode。

2) 插入模式(Insert mode)

        进入命令行模式后,如要编辑按字母 i 即进入插入模式,这样就可以编写程序及文字了。

  只有在Insert mode下,才可以做文字输入,按「ESC」键可回到命令行模式。

3) 底行模式(last line mode)

    在命令行模式下按 : 即进入底行模式,比如将文件保存或退出vi,也可以设置编辑环境,如寻找字符串、列出行号……等。
   :set nu //列出行号
  :set nonu //取消行号 。

   不过一般我们在使用时把vi简化成两个模式,就是将底行模式(last line mode)也算入命令行模式command mode)。

2、vi的基本操作

a) 进入vi

  [redhat@localhost ~]$ vi hello.c

  这时是处于命令行模式(command mode),如要编辑就切换到插入模式(Insert mode)才能够输入了。

b) 切换至插入模式(Insert mode)编辑文件

  在命令行模式(command mode)下按一下字母 i 就可以进入插入模式(Insert mode),这时就可以开始输入了。

c) Insert 的切换

  在处于插入模式(Insert mode)状态下,如一直输入文字发现输错了字,这时想用光标键往回移动,将该字删除,就要先按一下 ESC 键转到命令行模式(command mode)再删除文字。

d) 退出vi及保存文件

  在命令行模式(command mode)下,按一下 : 冒号 这时就进入底行模式(Last line mode)
       例如:

               :w filename (输入 w filename 将文章以指定的文件名filename保存)

               :wq (输入 wq 存盘并退出vi)

               :q! (输入 q! ,不存盘强制退出vi)

3、命令行模式(command mode)下的功能键

1)插入模式

  按 i 切换进入插入模式(insert mode),按 i 进入插入模式后是从光标当前位置开始输入文件;

  按 a 进入插入模式后,是从目前光标所在位置的下一个位置开始输入文字;

  按 o 进入插入模式后,是插入新的一行,从行首开始输入文字。

2)从插入模式切换为命令行模式

  按 ESC 键。


3)移动光标

   vi可以直接用键盘上的光标来上下左右移动,但正规的vi是用小写英文字母 k、j、h、l,分别控制光标上、下、左、右 移一格。

  按 ctrl+b:屏幕往“后”移动一页,B代表Before

  按 ctrl+f:屏幕往“前”移动一页,F代表Forward

  按 ctrl+u:屏幕往“后”移动半页,U指Up

  按 ctrl+d:屏幕往“前”移动半页,D指Down

                    注:上面是指按下Ctrl键的同时再按f等键。

       按 CRTL+Y : 向上滚动屏幕
       按 CRTL+E :向下滚动屏幕

使用z重新定位屏幕命令

          z + 回车        // 把当前行移动到屏幕顶部
扩展下上命令如

         100z + 回车    // 将移动第100行到屏幕的顶部,记得键入100z之后要再回车
         z.            // 把当前行移动到屏幕中央,不用回车,切记
         z-            // 把当前行移动到屏幕底部,同上,不用回车

 

按搜索移动
         事实上,对于一个源程序文件我们往往是要查找其中的一个变量或函数名,最有效的方法就是按文本搜索快速移动。
         /pattern         // 向前搜索模式,pattern代指要搜索的内容
        ?pattern         // 向后搜索模式
        n                // 重复上次搜索
         N                // 反方向重复上次搜索

 

按行号移动
        nG              // 移动到第n行,注意此处G是大写
        如100G则能快速定位到源程序中第100行代码位置处,想必是很有用的。
        Ctrl + g        // 显示当前行(并不是移动命令)
        G               // 移动到文件的尾部

  按数字 0 :移到文章的开头。

  按 G :移动到文章的最后。
        按 g :移动到文章的最开始。

  按 Shift+$ :移动到光标所在行的“行尾”。

  按 Shift+^ :移动到光标所在行的“行首”

  按 w :光标跳到下个字的开头

  按 e :光标跳到下个字的字尾

  按 b :光标回到上个字的开头

  按 #l :光标移到该行的第#个位置,在底行模式下,如:将光标定在第5行, :5l

4)删除文字

  x:每按一次,删除光标所在位置的“后面”一个字符。

  #x:例如,6x 表示删除光标所在位置的“后面”6个字符。

  X:大写的X,每按一次,删除光标所在位置的“前面”一个字符。

  #X:例如,20X 表示删除光标所在位置的“前面”20个字符。

  dd:删除光标所在行。

  #dd:从光标所在行开始删除#行

5)复制

  yw:将光标所在之处到字尾的字符复制到缓冲区中。

  #yw:复制#个字到缓冲区

  yy:复制光标所在行到缓冲区。

  #yy:例如,「6yy」表示拷贝从光标所在的该行“往下数”6行文字。

  p:将缓冲区内的字符贴到光标所在位置。注意:所有与“y”有关的复制命令都必须与“p”配合才能完成复制与粘贴功能。

6)替换

  r:替换光标所在处的字符。

  R:替换光标所到之处的字符,直到按下「ESC」键为止。

7)回复上一次操作

   u :如果您误执行一个命令,可以马上按下 u ,回到上一个操作。按多次“u”可以执行多次回复。

8)更改

  cw:更改光标所在处的字到字尾处

  c#w:例如,c3w表示更改3个字

9)跳至指定的行

  ctrl+g 列出光标所在行的行号。

  #G:例如,15G,表示移动光标至文章的第15行行首。

4、底行模式(Last line mode)下的命令 

     在使用(last line mode)之前,请记住先按 ESC 键确定您已经处于命令行模式(command mode)下后,再按 : 冒号即可进入底行模式(last line mode)。
 
A) 列出行号

 :set nu :输入set nu 后,会在文件中的每一行前面列出行号。

    例如 :set nu //列出行号 或 :set number ;

             :set nonu //取消行号 或 :set nonumber ;

             :set ai  //不自动缩进 或 :set autoindent ;

             :set noai  //显示Tab及行尾字符 或 :set noautoindent ;

            :set list    //隐藏Tab及行尾字符
            :set nolist   //设置Tab宽度为4个字符
            :set tabstop=4   //查看当前设置
            :set all 

B) 跳到文件中的某一行

  #:#号表示一个数字,在冒号后输入一个数字,再按回车键就会跳到该行了,如输入数字15,再回车,就会跳到文章的第15行。

C) 查找字符

 /关键字:先按 / 键,再输入寻找的字符,然后回车,如果第一次找的关键字不是您想要的,可以一直按 n 会往后寻找到想要的关键字为止。

 ?关键字:先按 ? 键,再输入寻找的字符,如果第一次找的关键字不是您想要的,可以一直按 n 会往前寻找到您要的关键字为止。

D) 保存文件

 w:在冒号输入字母 w 就可以将文件保存起来。

E) 离开vi

 q:按 q 就是退出,如果无法离开vi,可以在 q 后跟一个 ! 强制离开vi。如q!

 qw:一般建议离开时,搭配 w 一起使用,这样在退出的时候还可以保存文件。

5、vi命令列表

1)下表列出命令模式下的一些键的功能:

    h 左移光标一个字符

    l 右移光标一个字符

    k 光标上移一行

    j 光标下移一行

    ^ 光标移动至行首

   0 数字“0”,光标移至文章的开头

   G 光标移至文章的最后

   $ 光标移动至行尾

   Ctrl+f 向前翻屏

   Ctrl+b 向后翻屏

   Ctrl+d 向前翻半屏

   Ctrl+u 向后翻半屏

   i 在光标位置前插入字符

   a 在光标所在位置的后一个字符开始增加

   o 插入新的一行,从行首开始输入

   ESC 从输入状态退至命令状态

   x 删除光标后面的字符

   #x 删除光标后的#个字符

   X (大写X),删除光标前面的字符

   #X 删除光标前面的#个字符

   dd 删除光标所在的行

   #dd 删除从光标所在行数的#行

   yw 复制光标所在位置的一个字

   #yw 复制光标所在位置的#个字

   yy 复制光标所在位置的一行

   #yy 复制从光标所在行数的#行

   p 粘贴

   u 取消操作

   cw 更改光标所在位置的一个字

   #cw 更改光标所在位置的#个字

2)下表列出行命令模式下的一些指令 w filename 储存正在编辑的文件为filename

   wq filename 储存正在编辑的文件为filename,并退出vi

   q! 放弃所有修改,退出vi

   set nu 显示行号

   /或? 查找,在/后输入要查找的内容

   n  与/或?一起使用,如果查找的内容不是想要找的关键字,按n或向后(与/联用)或向前(与?联用)继续查找,直到找到为止。

用vi时要注意:

 1、用vi打开文件后,是处于命令行模式(command mode),要切换到插入模式(Insert mode)才能够输入文字。
       切换方法:在命令行模式(command mode)下按一下字母 i 就可以进入插入模式(Insert mode),这时就可以开始输入文字了。
 2、编辑好后,需从插入模式切换为命令行模式才能对文件进行保存,切换方法:按「ESC」键。
 3、保存并退出文件:在命令模式下输入:wq即可!(别忘了wq前面的:)

 ----------------------------------vi高级命令----------------------------------

vi高级命令:
    xp  :交换两个字符位置
   ddp :上下两行调换                                                                                                              
   :g/^/m0/ :把文件内容反转。(底行模式)
   J 上下两行合并 
   dG : 删除所有行
   d$ :从当前位置删除到行尾                                                     
   y$ 如果要粘贴到其他地方 p 就可以了 :从当前位置复制到行尾  由于vi 是建立在 EX 上的 所以 当键入 : 时就来到了 EX 命令状态
   :ab string strings :例如::ab usa 回车时看到:ab usa United States of America 就蹦出来了                
   nny :表示拷贝从光标行起的下 n 行内容,p 表示paste,可刚复制的内容粘贴在光标处的下面。
   r :单个字符替换
   R :覆盖多个字符
   s :用多个字符替换一个字符
   S :整行替换
   k :上移
   #k :上移#行
   j :下移
   #j :下移# 行

在当前屏幕中:                                                              
  H 跳到第一行                                                                
  M 跳到中间一行                                                              
  L 跳到最后一行 

删除命令操作                                                                  
  d l 删除当前字符(与x命令功能相同)                                     
  d 0 删除到某一行的开始位置                                                
  d ^ 删除到某一行的第一个字符位置(不包括空格或TA B字符)
  d w 删除到某个单词的结尾位置                                              
  d 3 w 删除到第三个单词的结尾位置                                        
  d b 删除到某个单词的开始位置                                              
  d W 删除到某个以空格作为分隔符的单词的结尾位置                            
  d B 删除到某个以空格作为分隔符的单词的开始位置                            
  d 7 B 删除到前面7个以空格作为分隔符的单词的开始位置                    
  d) 删除到某个语句的结尾位置                                                
  d 4) 删除到第四个语句的结尾位置                                          
  d( 删除到某个语句的开始位置                                                
  d } 删除到某个段落的结尾位置                                              
  d { 删除到某个段落的开始位置                                              
  d 7 { 删除到当前段落起始位置之前的第7个段落位置                        
  d d 删除当前行                                                            
  d /t e x t 删除从文本中出现“ t 该字样所出现的 e x t”中所指定字样的位置,一直向前直到下一个位置(但不包括该字样)之间的内容                                              
  d fc 删除从文本中出现字符“c”的括位置,一直向前直到下一个该字符所出现的位置(包该字符)之间的内容                                                            
  d tc 删除当前行直到下一个字符“ c”所出现位置之间的内容                
  D 删除到某一行的结尾                                                        
  d $ 删除到某一行的结尾                                                    
  5 d d 删除从当前行所开始的5行内容                                      
  d L 删除直到屏幕上最后一行的内容                                          
  d H 删除直到屏幕上第一行的内容                                            
  d G 删除直到工作缓存区结尾的内容                                          
  d 1 G 删除直到工作缓存区开始的内容                                      

修改命令操作                                                                  
  c l 更改当前字符                                                          
  c w 修改到某个单词的结尾位置                                              
  c 3 w 修改到第三个单词的结尾位置                                        
  c b 修改到某个单词的开始位置                                              
  c W 修改到某个以空格作为分隔符的单词的结尾位置                            
  c B 修改到某个以空格作为分隔符的单词的开始位置                            
  c 7 B 修改到前面7个以空格作为分隔符的单词的开始位置                    
  c 0 修改到某行的结尾位置                                                  
  c) 修改到某个语句的结尾位置                                                
  c 4) 修改到第四个语句的结尾位置                                          
  c(修改到某个语句的开始位置                                                
  c } 修改到某个段落的结尾位置                                              
  c { 修改到某个段落的开始位置                                              
  c 7 { 修改到当前段落起始位置之前的第7个段落位置                        
  c tc 修改当前行直到下一个字符c所出现位置之间的内容                      
  C 修改到某一行的结尾                                                        
  c c 修改当前行                                                            
  5 c c 修改从当前行所开始的5行内容                                      

替换命令操作                                                                  
  s 将当前字符替换为一个或多个字符                                            
  S 将当前行替换为一个或多个字符                                              
  5 s 将从当前字符开始的5个字符替换为一个或多个字符                        


vi替换使用规则:                                                            
  :g/s1/s/s2/s3/g 第一个g表示对每一个s2都用s3替换包括s1的行都进行替换,第二个 g 表示对每一行包括s1的行所有的 s 表示替换,s2是要被替换的字符串替换字符串,他可以和s1相同(如果相同的话用//代替),s3是16.                                                                        

  fx 往右移动到 x 字符上                                                        
  Fx 往左移动到 x 字符上                                                        
  tx 往右移动到 x 字符前                                                        
  Tx 往左移动到 x 字符后                                                        
  (注意:以上四个命令中,其中x是键入的字符)                                  
  ;                                                                            
  分号,配合 f 和 t 使用,重复一次                                       
  ,                                                                            
  逗号,配合 f 和 t 使用,反方向重复一次 

 

如何在“unix命令行”下将一个文件的某字符串用另一个串换掉            

  sed 's/string1/string2/gp' file1 > file2


将/etc/hosts下所有的地址都ping 2次                      

   1 #/usr/bin/sh                                          

   2 #grad /etc/hos
 ts and ping each address
 
   3 cat /etc/hosts|grep -v '^#
 ' | while read LINE
 
   4 do                                                              
   5 ADDR=`awk '{print $1}'`                  
   6 for MACHINE in $ADDR                          
   7 do                                                            
   8 ping $MACHINE -n 2                      
   9 done                                                        
   10 done  

附图vi_vim:
http://hi.csdn.net/space-10159623-do-album-picid-998234.html

--------------------------------------------Practice makes perfect!----------------------------------------

 

原创粉丝点击