分享

linux下的vi command

 WUCANADA 2011-09-30

linux下的vi command  

2007-12-15 15:49:45|  分类: 默认分类 |字号 订阅

精通vi命令
如何启动vi命令呢?
当你在图形模式时,你得先打开终端,然后在shell提示符下输入vi,就可以了。
当然你也可以指定一个文件名;如:
$vi script.txt
表示在当前目录下创建了一个空文本文件script.txt

你也可以提供一个或更多个文件。(如果所提供的文件名不存在,则创建)
例如:
$vi file.txt1 file.txt2

现在让我们来了解如何退出vi,以及保存在vi中所做的修改和如何得到帮助信息。
退出vi有如下的命令格式:
   :n    当你指定了多个文件时,使用这个命令来编辑下一个文件。
   :q    不保存文件退出.
   :q!    不保存文件,并强制退出.
   :wq file    保存文件并退出,这里的file代表相对路径的文件名,或者是绝对路径的文件名。
   :w file     保存文件,如果没有指定文件名,就是当前的文件名。
   :w!    强制保存文件(前提是你对这个文件具有写的权限)。
   :x    保存文件并退出,等价于ZZ命令。
   ZZ    保存文件并退出。
   zz    以当前鼠标位置为准,向前滚动半屏。
   :h    请求帮助
让我们来看看几个最基本的例子
假如你想新建一个文件名为script.txt,路径为当前目录。可以在shell模式下,输入如下:
$vi script.txt
现在你就进入了vi命令,现在你就可以用上面的退出命令退出了。
上面的命令只告诉我们如何退出vi,和保存文件,我们还不知如何对文件进行编辑和修改。基本的命令如下:
   插入命令:
   想插入新的内容,得先导航到插入的位置,然后进入修改模式:
    i        在当前鼠样之前进入插入模式,并替换文本。
    I        在行的开始处进入插入模式
    a        在当前鼠标之后进入插入模式,添加或替换文本。
    A        在当前行的末尾进入插入模式。
    o        在当前行的下面插入一个新行
    O        在当前行的上面插入一个新行。
    J        将下一行与当前行合并成一行
    :e file       编辑指定的文件,并退出当前的文件。(file 表示路径加文件名)
    :e!          重新读取当前文件,并放弃所做的修改。
    :r filename    在当前行处插入一个新的文件
编辑命令
    C        删除从当前光标到行尾,并进入插入模式。
    cc        删除整行,并进入插入模式。
    S         删除整行,并进入插入模式。
    s         删除当前光标处的字符,并进入插入模式
    cw         在当前光标处删除一个单词,并进入插入模式。
    R        进入插入模式(一种不同的插入模式),并覆盖已存在的字符。
    u        撤消上一次的操作
删除命令
    从指定的位置删除一个文本块
    dl        删除当前光标处的字符
    ndl        删除当前光标处的n个字符(向前计算)
            如:3dl 将要删除3个字符
    dw        删除当前光标处的单词
    ndw        删除当前光标处的n个单词(向前计算)
            如:5dw 将要删除5个单词
    dG        删除从当前光标到文件的末尾
    dd or :d     删除当前行
    ndd        从当前行开始,向前删除n行,
        如:3dd 将要删除3行
    D        删除从当前光标到行末,等价于d$
    d)         除了拥有D和d$的功能外,还有下面描述的功能:
            把鼠标放在{,[ 或者(上,将要删除所有与之匹配的内容
            如:prints()
            { if [ -f $1 ]
            then
            ehco "the \$1 is a file"
            fi
        }
        当光标在{上时,按下d),就可删除{}之间的所有内容(假如你是在插入模式下,得先按             下‘esc’键,再将光标定位在{上,就可以了)
    x        删除当前光标处的字符,相当于dl命令
    X        删除当前光标左边处的字符
    :X        对文件加密(即给文件设置密码保护)
    nx        删除n个字符从当前光标处。
                例如:3x 将从当前光标处向前删除3个字符
复制与粘贴
   复制命令,通常是从一个指定的位置,复制一个文本块,以下是具体的命令:
    yl        向前复制一个字符(这里的字母顺序不能颠倒)
    yw        向前复制一个单词(这里的字母顺序不能颠倒)
    y$        从当位置复制到行尾(这里的字母顺序不能颠倒)
    yG         从当位置复制到文件的尾部(这里的字母顺序不能颠倒)
    yy or :y    复制整行
    nyy        从当前行开始,向前复制n行。(这里的字母顺序不能颠倒)
                如:3yy 从当前行开始向前复制3行
   粘贴操作是插入先前剪切板中的内容
    p(小写)    在当前光标的后面粘贴剪切板中的内容
    P(大写)    在当前光标的前面粘贴剪切板中的内容
    np        粘贴n次,p可以是大写,也可以是小写
                如3p 在当前光标的后面连续粘贴3次相同的内容
   
    上面讲了vi的进入,退出及编辑命令,在vi中,是不能用鼠标的,因此,我们还得来学一些导航命令,以让我们可以将光标定位在我们感兴趣的位置上。
   Ctrl-b        向上滚动一屏
   Ctrl-f     向下滚动一屏
   0(zero)    移动当前行的开始
   $        移动当前行的末尾
   ^        移动到当前行第一个非空白字符处
   $        移动到当前行的末尾
   b,B        向后滚动一个单词,以空白作为分隔符
   G        移动到文件的尾部(相当于Shift-g)
   nG or :n      从当前文件的开始行向前移动n行,
                如:1 Shift-g 将光标定位在当前文件的第一行
   h        向左移动一个字符
   H        移动到屏幕的顶部
   j        向下移动一行
   k        向上移动一行
   l        向右移动一个字符
   L        移动到屏幕的底部
   M            移动到屏幕的中间
   w,W        向前移动一个单词,光标在单词的开始处;白作为分隔符。
   e,E             向前移动一个单词,光标在单词的末尾处;白作为分隔符。
   {         向后移动一段
   }         向前移动一段
   (         向后移动一句话
   )           向前移动一句话
范围
当用:s命令去查找并替换多行时,常需要指定其范围,如::3,7表示从第三行到第七行,以下是一些常用的范围格式:
    :n ,m        从第n行到第m行
     :.           当前行
    :$           最后的一行
    :?c          Marker c
    :%           所有的行
    .,$           从当前位置到结尾
    :g/pattern/ 所有匹配的行
    %    这是一个特殊用途的命令。将光标放在 [, {, (上,然后按下‘%‘,光标就会自动跳到匹配的字符],},)上,并高亮显示(一般用在调试程序中)。
例如:
删除第三到第七行的内容:
:3,7d
给文件的所有行加上注释
:%s/^/#/
将文件的所有行取消注释
:%s/^#//

查找
   这下面的命令是用来查找文本的:
   /pattern    向前查找字符串,也可用正则表达式
   pattern    向后查找字符串,也可用正则表达式
   n        重做上次的查找操作(从当前光标向下查找匹配的位置)
   N        重做上次的查找操作在相反的方向(从当前光标向上查找匹配的位置)
例如:
   查找以字母a开头,后面为两个任意字符的单词
   /a.. or ?a..

替换
   :s/pattern/string/flags     用 string替换pattern
   :s是完成查找和替换的标志
   常用的flags(可选)有g和c
   g         是一个全局参数,表示所有,或者是全部
   c         只做一次,在替换之前并给出提示
   &        重做上一次的查找替换操作(须用一些导航命令将光标定位在需要替换的字符处)
  
   例如:
   用script替换scrit,从第一行到文件的结尾:
     :1,$ s/scrit/script/g
         这参数g表示在指定范围内替换全部,如果没有给定参数g,则只替换一次。
   查找aple并将它替换为apple; 查找范围:当前光标到文件的末尾
     :.,$s/aple/apple/g   (在$与s之间,有无空格都是正确的)
   在文件中查找并替换有以下两种方法:
    :%s/from/to/g
    :g/from/s//to/g
    说明:from是被替换的字符,to是用来替换的字符

正则表达式:
. (点)       任意单个字符,除了新行
*           匹配 0次或多次
[...]         匹配括号里的任意一个字符
[^ ...]       不匹配括号里的任意一个字符
^        开始标志
$         结束标志
\< , \>       前一个表示单词的开始,后一个表示单词的结束
\(: : :\)      分组(放进内存)
\n           n组的内容(从内存里调用)
如:查找以字母a或A开头,第二个字符任意,三个字符为c的单词
/[aA].c/

文件
   !!program    程序运行的结果来替换当前行的内容
   :r!command   从shell命令里读取输出值。
        如::r!which perl

其它命令   
Ctrl-]        打开超链接
Ctrl-T        返回到打开超链接之前的文本
:se nu         在各行的前面显示行数
:se nonu       撤消显示行数
.             重做上一次文本改变的命令。假如你刚做过粘贴操作,按下‘.’,将继续做粘贴操作
u            撤消上一次的操作;假如你上次做了粘贴操作,这个命令将会撤消上次的粘贴操作
U         撤消在一行中所做的所有更改。(这个命令的作用范围在一行)
ctrl-l        刷新窗口

以下是一个非常有趣的命令,有时你想把你输入的内容,原封不动的复制n遍,而你不想用上面的关于复制,粘贴的命令。以下的操作将会在你输入完内容后,自动重复n次你先前做的内容:
假如你想把你即将要输入的内容,自动重复3遍:
第一步:输入 ‘3i‘(’i’表示进入插入模式)
第二步:输入你想输入的内容
(假定为以下内容:
     #awk '$3<5 {printf "%s\t%s\n",$1,$2;} $3>6 {printf "the price greater than \$6 %s\t%s\n",$1,$2}' 2.txt
                                                                               
     #note: don't appent the $ after the regular expression)
第三步:按下<ESC>键,得到的结果如下:
   #awk '$3<5 {printf "%s\t%s\n",$1,$2;} $3>6 {printf "the price greater than \$6 %s\t%s\n",$1,$2}' 2.txt
                                                                               
     #note: don't appent the $ after the regular expression)#awk '$3<5 {printf
"%s\t%s\n",$1,$2;} $3>6 {printf "the price greater than \$6 %s\t%s\n",$1,$2}' 2.txt
                                                                               
     #note: don't appent the $ after the regular expression)#awk '$3<5 {printf
"%s\t%s\n",$1,$2;} $3>6 {printf "the price greater than \$6 %s\t%s\n",$1,$2}' 2.txt
                                                                               
     #note: don't appent the $ after the regular expression)
    
当然,你也可以将i 改为o或a   
做完了上面的命令,是不是感到对vi命令已经有了一个清楚的认识了;也许你会想,既然不能用鼠标,那能不能像鼠标一样,通过按下鼠标左键,就可选定想选定的内容呢,答案是肯定的。现在让我们来看看如何做到:
假如你想选定一行中的某一部分,并将它复制,然后粘贴到你想粘贴的位置:
第一步:将光标定位在你想选定的那个位置(通过前面讲的导航命令)
第二步:按下<ctrl-v>组合键
第三步:按方向键,调整并选取所需内容,选中的内容将会以另一种颜色出现,确定选中的内容后,按下'y',就完成了复制操作。
第四步:将光标定位在你想粘贴的位置,按下p键即可

提示:当你进入插入模式后,你又想对某一句话,或单词进行复制,你必须先按下<ESC>键,才能进入复制操作的命令;总之:你在插入模式下,想用其它的命令,你都得先按下<ESC>键。
------------------------------------------------------------------------------------------------------------------------------------------

 一、简介

  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 ——拷贝一行到剪贴板/取出剪贴板中内容的命令。

三、常见问题及应用技巧

  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。

-------------------------------------------------------------------------------------------------------------------------------------------

vi编辑器使用方法|vi热键|vi快捷键

vi是在工作站上广泛使用的编辑软件。对初学者而言,
常因其特殊的使用方法,而不得其门而入;对已经在使用 vi 的使用者来说,也
常见因对 vi 的不熟悉或不够了解,而无法发挥出 vi 强大的编辑能力,以下将
简单介绍 vi 的使用方法。不必死记硬背,多实际操作几次就能记住常用的命令。
进入vi
直接执行 vi编辑程序即可:
%vi test
此刻屏幕上会出现 vi 的编辑屏幕,同时 vi 会将文件复制一份至内存中的缓冲区 (buffer) 。 vi会保留在硬盘中的文件不变,而先对缓冲区的文件作编辑,编辑完成后,使用者可决定是否要取代原来旧有的文件。
离开vi
若在输入模式下,则先利用《ESC》进入指令模式,而后即可选用下列指令
离开vi。
:q! 离开vi,并放弃刚在缓冲区内编辑的内容。
:wq 将缓冲区内的资料写入硬盘中,并离开vi。
:ZZ 同wq。
:x 同wq。
:w 将缓冲区内的资料写入硬盘中,但并不离开vi。
:q 离开vi,若文件被修改过,则会被要求确认是否放弃修改的内容。
此指令可与:w 配合使用。

vi 的操作模式

vi 提供两种操作模式:输入模式(insert mode)和指令模式(command mode)
。当使用者进入 vi 后,即处在指令模式下,此刻键入的任何字符都被视为
指令。在此模式下可进行删除、修改等动作。若要输入资料,则需进入输入
模式。

输入模式

如何进入输入模式
a (append) 由光标之后加入资料。
A 由该行之末加入资料。
i (insert) 由光标之前加入资料。
I 由该行之首加入资料。
o (open) 新增一行于该行之下以供输入资料。
O 新增一行于该行之上以供输入资料。

如何离开输入模式
《ESC》 结束输入模式。

指令模式

光标的移动
h 向左移一个字符。
j 向上移一个字符。
k 向下移一个字符。
l 向右移一个字符。
0 移至该行之首
$ 移至该行之末。
^ 移至该行的第一个字符处。
H 移至屏幕的第一列。
M 移至屏幕的中间那列。
L 移至屏幕的最后一列。
G 移至该文件的最后一列。
+ 移至下一列的第一个字符处。
- 移至上一列的第一个字符处。
( 移至该句之首。 (注一)
) 移至该句之末。
{ 移至该段落之首。 (注二)
} 移至该段落之末。
nG 移至该文件的第 n 列。
n+ 移至光标所在位置之后的第 n 列。
n- 移至光标所在位置之前的第 n 列。
<Ctrl><g> 会显示该行的行号、文件名称、文件中最末行的行号、光标
所在行号占总行号的百分比。

注一:句子(sentence)在vi中是指以『!』、『.』或『?』结束的一串字。
注二:段落(paragraph)在vi中是指以空白行隔开的文字。

屏幕的移动

<Ctrl><f> 屏幕往下卷一页。
<Ctrl> 屏幕往上卷一页。
<Ctrl><d> 屏幕往下卷半页。
<Ctrl> 屏幕往上卷半页。
<Ctrl><e> 屏幕往下卷一行。
<Ctrl><y> 屏幕往上卷一行。

删除、复制及修改指令介绍 (此单元较少使用)

d(delete)、c(change)和y(yank)这一类的指令在 vi 中的指令格式为:
Operator + Scope = command
(运算子) (范围)
运算子:
d 删除指令。删除资料,但会将删除资料复制到内存缓冲区。
y 将资料(字组、行列、句子或段落)复制到缓冲区。
p 放置(put)指令,与 d 和 y 配和使用。可将最后delete或yank的资
料放置于光标所在位置的行列下。
c 修改(change)指令,类似delete与insert的组合。删除一个词组、句
子等的资料,并插入新输入的资料。

范围:
e 由光标所在位置至该字符串的最后一个字符。
w 由光标所在位置至下一个字符串的第一个字符。
b 由光标所在位置至前一个字符串的第一个字符。
$ 由光标所在位置至该行的最后一个字符。
0 由光标所在位置至该行的第一个字符。
) 由光标所在位置至下一个句子的第一个字符。
( 由光标所在位置至该句子的第一个字符。
{ 由光标所在位置至该段落的最后一个字符。
} 由光标所在位置至该段落的第一个字符。

整行动作
dd 删除整行。
D 以行为单位,删除光标后的所有字符。
cc 修改整行的内容。
yy yank整行,使光标所在该行复制到内存缓冲区。

删除与修改

x 删除光标所在该字符。
X 删除光标所在之前一字符。
dd 删除光标所在该行。
r 用接于此指令之后的字符取代(replace)光标所在字符。
如: ra 将光标所在字符以 a 取代之。
R 进入取代状态,直到《ESC》为止。
s 删除光标所在的字符,并进入输入模式直到《ESC》。
S 删除光标所在的该行资料,并进入输入模式直到《ESC》。

移动与复制

利用 delete 及 put 指令可完成资料移动的目的。
利用 yank 及 put 指令可完成资料复制的目的。
yank 和 delete 可将指定的资料复制到内存缓冲区,而通过 put 指令
可将缓冲区内的资料复制到屏幕上。
例:
移动一行 .在该行执行 dd
.光标移至目的地
.执行 p
复制一行 .在该行执行 yy
.光标移至目的地
.执行 p

指令重复

在指令模式中,可在指令前面加入一数字 n,则此指令动作会重复执行 n
次。
例:
删除10行 .10dd
复制10行 .10yy
.光标移至目的地
.p
指标往下移10行 .10j

取消前一动作(Undo)

即复原执行上一指令前的内容。

u 恢复最后一个指令之前的结果。
U 恢复光标该行的所有改变。

查找

在vi中可查找某一字符串,使光标移至该处。

/字符串 往光标之后寻找该字符串。
字符串 往光标之前寻找该字符串。
n 往下继续寻找下一个相同的字符串。
N 往上继续寻找下一个相同的字符串。

资料的连接

J 句子的连接。将光标所在的下一行连接至光标该行的后面。

若某行资料太长亦可将其分成两行,只要将光标移至分开点,进入输入模式
(可利用 a、i等指令)再按《Enter》即可。

环境的设定

:set nu 设定资料的行号。
:set nonu 取消行号设定。
:set ai 自动内缩。
:set noai 取消自动内缩。

自动内缩(automatic indentation)
在编辑文件或程序时,有时会遇到需要内缩的状况,『:set ai』即提供自
动内缩的功能,用下例解释:
.vi test
.(进入编辑屏幕后)
this is the test for auto indent
《Tab》start indent ← :set ai (设自动内缩)
《Tab》data
《Tab》data
《Tab》data ← :set noai (取消自动内缩)
the end of auto indent.
.注:<Ctrl><d> 可删除《Tab》字符。

ex指令

读写资料
:w 将缓冲区的资料写入硬盘中。
:10,20w test 将第10行至第20行的资料写入test文件。
:10,20w>>test 将第10行至第20行的资料加在test文件之后。
:r test 将test文件的资料读入编辑缓冲区的最后。

删除、复制及移动
:10,20d 删除第10行至第20行的资料。
:10d 删除第10行的资料。
:%d 删除整个编辑缓冲区。
:10,20co30 将第10行至第20行的资料复制至第30行之后。
:10,20mo30 将第10行至第20行的资料移动至第30行之后。

字符串搜寻与取代
s(substitute)指令可查找某行列范围。
g(global)指令则可查找整个编辑缓冲区的资料。
s指令以第一个满足该条件的字符串为其取代的对象,若该行有数个满足该条
件的字符串,也仅能取代第一个,若想取代所有的字符串则需加上g参数。
:1,?$s/old/new/g 将文件中所有的『old』改成『new』。
:10,20s/^/ / 将第10行至第20行资料的最前面插入5个空白。
:%s/old/new/g 将编辑缓冲区中所有的『old』改成『new』。

恢复编辑时被中断的文件

在编辑过程中,若系统当掉或连线中断,而缓冲区的资料并还未
被写回硬盘时,当再次回到系统,执行下列指令即可回复中断前
的文件内容。
%vi -r filename

编辑多个文件

vi还提供同时编辑多个文件的功能,方法如下:
%vi file1 file2 ..

当第一个文件编辑完成后,可利用『:w』将该缓冲区存档,而后
再利用 『:n』载入下一个文件。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多