BSD下vi用法详解


    vi用法
     VI命令可以说是Unix/linux世界里最常用的编辑文件的命令了,但是因为它的命令集众多,很多人都不习惯使用它,其实您只需要掌握基本命令,然后加以灵活运用,就会发现它的优势,并会逐渐喜欢使用这种方法。本文旨在介绍VI的一些最常用命令和高级应用技巧。
    一、基本命令介绍
    ---- 1.光标命令
    k、j、h、l——上、下、左、右光标移动命令。虽然您可以在linux中使用键盘右边的4个光标键,但是记住这4个命令还是非常有用的。这4个键正是右手在键盘上放置的基本位置。
    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——删除一个字符、删除光标所在处到行尾的所有字符以及删除整行的命令。
    按ESC跳出编辑模式到命令模式
    ---- 3.查找命令
    ---- /string、?string——从光标所在处向后或向前查找相应的字符串的命令。
    ---- 4.拷贝复制命令
    ---- yy、p——拷贝一行到剪贴板或取出剪贴板中内容的命令。
    二、常见问题及应用技巧
    ---- 1.在一个新文件中读/etc/passwd中的内容,取出用户名部分。
    ---- vi file
    ---- :r /etc/passwd 在打开的文件file中光标所在处读入/etc/passwd
    ---- :%s/:.*//g 删除/etc/passwd中用户名后面的从冒号开始直到行尾的所有部分。
    ---- 您也可以在指定的行号后读入文件内容,例如使用命令“:3r /etc/passwd”从新文件的第3行开始读入 /etc/passwd的所有内容。
    ---- 我们还可以使用以下方法删掉文件中所有的空行及以#开始的注释行。
    ---- #cat squid.conf.default | grep -v '^$' | grep -v '^#'
    ---- 2.在打开一个文件编辑后才知道登录的用户对该文件没有写的权限,不能存盘,需要将所做修改存入临时文件。
    ---- vi file
    ---- :w /tmp/1 保存所做的所有修改,也可以将其中的某一部分修改保存到临时文件,例如仅仅把第20~59行之间的内容存盘成文件/tmp/1,我们可以键入如下命令。
    ---- vi file
    ---- :20,59w /tmp/1
    ---- 3.用VI编辑一个文件,但需要删除大段的内容。
    ---- 首先利用编辑命令“vi file”打开文件,然后将光标移到需要删除的行处按Ctrl+G显示行号,再到结尾处再按Ctrl+G,显示文件结尾的行号。(注:可以先用命令:set nu来显示全部的行号)
    ---- :23,1045d 假定2次得到的行号为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/ 仅替换文件中的第3行到第7行中的“string1”成“string2”。
    ---- 注意: 其中s为substitute,%表示所有行,g表示global。
    ---- 5.同时编辑2个文件,拷贝一个文件中的文本并粘贴到另一个文件中。
    ---- 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”实现,其中“”是转义字符,表明其后的“/”字符是具有实际意义的字符,不是分隔符。(linux知识宝库)
    --------------------------------------------------------------------------------------------
    vi的简单用法:
    进入vi后 有两种模式
    1.编辑模式
    2.命令模式
    进入vi后默认是命令模式,所以不要乱按 就会得到dd的警告声,要输入文字的话 请按a后i 就可以开始输入文字拉!
    输入结束后 请按esc键回命令模式
    输入q就是退出
    输入wq就是存盘后退出
    输入q!放弃存盘强行退出
    Vi 的使用
    Vi 已经是 Unix 系统中标准的文字编辑器, 每个人员都必须熟悉它, 因为你会在维护系统时常常遇到它.
    Vi 对初学者而言, 第一印象总是不好, 觉得它难用. 其实, 大家在用惯了办公室软件之后, 再回过头来用这些未见过的怪物, 难免无法适应, 这是很正常的. 但别忘了, 各位都将是学校中重要的人员,您的角色不再是纯粹的使用者, 而是一位面对复杂网络的管理者及问题解决者, 你必须能够亲手操控你的系统, 设定你的系统, 调整你的系统, 而这个过程, 你就不得不去面对 Vi.
    不要拿 Word 的使用习惯来挑剔 Vi, 它们的作用方向不同, 风格也不同, 一旦您能上手, 也许你会喜欢上它. Vi 是网络管理人员的标准左右手.
    So, 打开你的心, 接受会比反弹更有收获.
    二. 开启档案, 关闭档案
    vi 檔名 开启档案
    : 进入命令列的方法
    q 离开 (命令列)
    wq 存盘然后离开 (命令列)
    q! 放弃存盘, 强迫离开 (命令列)
    ZZ 存盘然后离开 (不在命令列使用)
    :e 檔名 在 Vi 中开启档案
    三. Vi 的操作模式:
    Vi 有二种主要的操作模式, ESC 键为单向的切换键(由本文输入模式回到编辑命令模式)
    编辑命令模式 : 要 vi 做一些特定目的的动作. 如,附加,取代,修改,删除,移动光标,搜寻等等. 若是存盘等动作, 则需在命令列中下达, 欲切换至命令列, 需先按 :
    本文输入模式 : 在此模式下, 任何字符, 皆被视为输入的数据.
    一开始进入 Vi 之后, 即进入编辑命令模式, 你输入的每一个字符, 皆被预视为一个指令. 有效的指令会被接受, 若是无效的指令, 会产生 beep beep 声, 以示警告.
    若想做输入的动作, 必须切换为本文输入模式, 切换的方法, 只要单按一个特殊意义的字符键即可, 如下所示:
    按 i 或 I 状态
    按 a 或 A 附加状态
    按 R 取代状态R 会进行连续字符取代
    按 s 或 S 删除一个字符;删除光标所在那一列
    按 cw, c2b, c$, c0 修改状态
    按 o 或 O 新增空白列
    你不必一下子全用上, 只要会 i, a, o 这个三个模式即可胜任愉快, 因为大部份时候, 你也只用这三个.
    OK, 现在你可以试着在本文输入模式下, 键入一些资料看看. 然后, 按 ESC 切换回编辑命令模式.
    四. 移动光标:
    Vi 为了适用于各种不同的终端机模式, 因此以字键的方式来操控光标.
    k j h l 上 下 左 右
    Enter 换列
    w b 往前一个 word ; 一个 word
    0 $ 至该列开头 ; 至该列尾端
    + - 往下一列; 往上一列
    请记住一个要诀:
    在 Vi 中, 大部份的命令都可以在其前面加上数字, 该数字表示重复该命令的次数.
    例如: 8l 表示往右移动 8 个字符, 3w 表示往前移动三个 word, 2b 表示 2 个 word
    注: word 的定义, 连续英数字元形成一个 word, 而其它特殊符号则每一个字符便是一个 word(除非连续特殊字符), 例如: --classify 中含有 2 个 word, 一个是 -- ; 一个是 classify
    而 -x, 则有 3 个 word.
    在特殊的终端机模式下, 方向键也是可以使用的. 如 linux 或 vt100.
    其实大部份时候, 你仍可以保有使用方向键的习惯. 但大概只有 local 下才能使用 PgUp , PgDn, End, Home 等键喔!
    不过, 若你所使用的终端机模式不支持方向键, 那么上表中的按键, 就相当重要了.
    五. 卷页:
    ctrl+f 往下一页 (forward)
    ctrl+b 往上一页 (before)
    ctrl+d 往下半个屏幕(down)
    ctrl+u 往上半个屏幕(up)
    六. 跳列:
    你可以指定跳至某一列位置. 跳动之前, 先查看一下目前所在列数是多少.
    ctrl+g 可以显示目前的位置, 如: "ls.txt" line 53 of 264 --20%-- col 16-23
    上面表示, 目前是在第 53 列, 全部共有 264 列, 占该档百分之20的位置, 目前的光标, 实际是在第23行, 但只算成第16行, 因为中间有使用 tab 键.
    80G 或 80gg 跳至第 80 列
    G 跳至文件尾
    gg 跳至文件头
    七. 删除: (但不会进入本文输入模式)
    x 删除一个字符
    dd 删除一行
    r 取代一个字符
    以上皆针对光标目前的所在位置产生作用.
    还有 dw, db, de, d0, d$ 等命令, 但你不须一下子全用上. 上表中这三个够用了.
    记住一个要诀: Vi 的命令繁多, 但你真正用上手的不必多, 而且这些也就够了.
    八. undo (回复动作):
    若你对上一个动作反悔了, 可以使用 undo 的功能:
    u 取消上一个动作所产生的改变
    U 取消光标所在那一列所有的改变
    :e! 取消所有的改变, 回复至未修改之前
    九. 关键词搜寻/取代:
    / 关键词 往下搜寻关键词
    ? 关键词 往上搜寻关键词
    n 重复搜寻命令(不管往下或往上) (注:等于是“寻找下一个”)
    N 和 n 相反方向
    cw字符串 以该字符串取代原有的关键词
    n. 继续取代该字符串的动作
    %s/目标/取代/g 将目标字符串全换成取代字符串
    十. 选取、复制与搬移:
    Y 或 yy 选取光标所在那一列
    5Y 或 5yy 选取光标列所在共5列(5 只是一个例子, 可改用其它数字)
    p 将选取的内容, 复制至光标之后
    P 将选取的内容, 复制至光标之前
    cw, x, dd 等删除命令 会将被删除的内容放入 buffer 中, 配合 p 或 P 即可做出搬移的效果.
    十一. 暂时跳出 Vi:
    在编辑过程中, 你可能想要执行其它命令, 方法如下:
    :! 命令 执行该令命
    :sh 暂时跳出 Vi, 欲回 Vi 按 ctrl+d 或 exit