第五章 编辑程序vi 概述 1. 编辑器的基本工作流程: 内 存 编 辑 缓 "窗口" 冲 区 磁盘 文件系统 ②编辑文件 2019年5月4日 概述 1. 编辑器的基本工作流程: ②编辑文件 窗 口 上 下 移 动 内 存 编 辑 缓 冲 区 ③将编辑结果写回到磁盘中 "窗口" 显示部分文本 磁盘 文件系统 ①读入已有文件或建立新文件
编辑器的类型 根据编辑命令每次处理的文本单位, 可将编辑器分 为: . 行编辑器 :编辑单位为行 。命令为edit、e、ex . 屏幕编辑器 : 编辑单位为字符 。 命令为vi、v、view 在实际UNIX系统中, 把两类编 辑器的功能融合在一起形成一个 统一的编辑器. 事实上这几个命 令通常都对应一个编辑器, 是一 个命令的多个名字. 屏幕编辑器 vi、view 行编辑器 edit、ex
屏幕编辑器 vi 1. vi 的两种工作模式 . 命令模式 ---- 进入vi 后的初始模式, 也是 vi 的基本工作 模式. 主要包括移动光标, 删除文本, 粘贴 文本和查找文本等. . 文本输入模式 ---- 是命令模式下的子模式. 该模式下除 ESC键以外的所有其它键都作为输入字符 添加到被编辑的文本中. 文本输入完成后 必须按ESC键从文本输入模式返回到命令 模式后, 才能继续完成其它操作.
vi 的基本使用 ① 从shell状态进入 vi , 命令格式为: $ vi filename ( 例如: vi abc ) 2019年5月4日 vi 的基本使用 ① 从shell状态进入 vi , 命令格式为: $ vi filename ( 例如: vi abc ) _ ~ “abc”[new file] 0 lines, 0 chars aaaaaaaaaa bbbbbbbbbb cccccccccc dddddddddd ~ “abc” 4 lines, 40 chars abc是不存在的新文件 abc是已存在的文件
退出 vi , 返回到shell状态下: 进入vi后程序通常处在vi的命令模式下, 要退出 vi , 可在命令模式下发出 :wq 并按回车键, 即可返回 到shell状态下. 说明: .在vi的命令模式下发出的编辑命令通常不需要 按回车键, 但以冒号(:)开始的编辑命令需要回 车键. .返回命令 :wq 可以分开发出.
三. vi 编辑命令 vi 编辑程序的主要功能包括: .输入文本 .移动光标 .删除文本 .替换文本 .搜索文本 .其它辅助操作 .替换文本 .搜索文本 .其它辅助操作 .保存文件, 退出编辑程序 文本输入模式 命令 模式
文本输入模式 从命令模式进入文本输入模式的命令键: i 在光标前插入文本 I 在光标所在行首插入文本 a 在光标后加入文本 2019年5月4日 文本输入模式 从命令模式进入文本输入模式的命令键: i 在光标前插入文本 I 在光标所在行首插入文本 a 在光标后加入文本 A 在光标所在行尾加入文本 o 在光标所在行下面新加一行 O 在光标所在行上面新加一行 ESC 退出文本输入模式, 返回命令模 式
Vi编辑器的工作模式 启动 命令模式 i : I 其他命令 :prompt a wq q q! A o O 输入模式 Esc 结束vi
2. 命令模式 光标移动 . ←↓↑→ 光标左下上右移动 . h j k l 光标左下上右移动 . ^ 光标从当前位置移到本行行首 . $ 光标从当前位置移到本行行尾 . + 光标下移一行 . - 光标上移一行 . 空格键 光标左移 . 退回键 光标右移
x、dw、dd命令前都可以加上数字,表示 同时删除多个单位。 2019年5月4日 删除文本 . x 删除光标所在字符 . dw 删除光标所在词(word)的从光 标开始到该词结尾的部分 . D 删除光标所在位置到行尾部分 . dd 删除光标所在行 x、dw、dd命令前都可以加上数字,表示 同时删除多个单位。
替换文本 .字符替换命令 r 把当前光标所在字符替换为紧跟在r 后面的字符 (只替换一个字符) .单词替换命令 cw 2019年5月4日 替换文本 .字符替换命令 r 把当前光标所在字符替换为紧跟在r 后面的字符 (只替换一个字符) .单词替换命令 cw 把当前光标所在单词中, 从光标所在 字符到该单词结尾部分, 替换为紧跟在 cw命令后输入的部分, 直到ESC键结束. (新输入部分可能与被替换部分不等长)
④ 搜索文本 ( / 和 ? 命令) 键入 / 后, / 出现在屏幕左下角, 当输入要 查询的字符串并按回车后, vi 从当前位置开 2019年5月4日 ④ 搜索文本 ( / 和 ? 命令) 键入 / 后, / 出现在屏幕左下角, 当输入要 查询的字符串并按回车后, vi 从当前位置开 始向文件尾方向进行查找, 并停留在找到的 第一个字符串位置. 如果按 n 则继续向文件 尾方向查找. 如果查找到文件尾后继续按 n 则又从文件头开始向文件尾方向进行查找. 在查找过程中如果按 N 键, 则是向文件头 方向进行查找. ? 命令与 / 命令功能完全相同, 只是查找 方向是从当前位置向文件头方向进行.
其它辅助操作 u 命令 取消最近一条修改文本的命令. . 命令 重复最近一条修改命令 J 命令 把下一行连接到当前行的行尾 2019年5月4日 其它辅助操作 u 命令 取消最近一条修改文本的命令. . 命令 重复最近一条修改命令 J 命令 把下一行连接到当前行的行尾 p 命令 把最近一次删除命令删除的内 容粘贴到当前光标之后, 光标以 后的内容依次向后移动; 如果最 近删除的是行, 则粘贴到当前行 下面, 原当前行下面的行依次向 下移动. 对一次删除的文本, 可 用p 命令粘贴任意多次.
例如: 删除/粘贴命令对( dd/p ) : 发2dd 后 下移一行按p 当前文本 复制/粘贴命令对 ( yy/p ) : 当前文本 2019年5月4日 11111111111 2222222222 3333333333333 444444444444 55555555555 3333333333333 444444444444 55555555555 3333333333333 444444444444 11111111111 2222222222 55555555555 发2dd 后 下移一行按p 当前文本 复制/粘贴命令对 ( yy/p ) : aaaaaaaaaaaa bbbbbbbbbbb ccccccccccccc aaaaaaaaaaaa bbbbbbbbbbb ccccccccccccc aaaaaaaaaaaa bbbbbbbbbbb ccccccccccccc 当前文本 下移两行按p 发2yy 后
保存文本, 退出编辑程序 :wq 保存文本, 退出vi , 返回shell :w 保存文本, 不退出, 继续在vi 中 :w file 把文本保存到文件file 中, 不退出 :q 退出vi , 返回到shell中 :q! 强行退出vi , 不保存修改过的文本 注: :q 命令如运行成功, 隐含着文本未被修改或 修改后已保存, 否则程序将给出错误提示, 并 拒绝退出.
3. vi 的工作模式和状态转换 login exit Shell 模式 man date who passwd 显示系 统时间 显示当 2019年5月4日 login exit Shell 模式 man date vi file who :wq passwd 显示系 统时间 显示当 前用户 联机 手册 修改 口令 vi 命令模式 dd ←↓↑→ ESC dw h j k l + - o a x i 改变 位置 删除 正文 vi 输入模式
在行编辑器中每一条编辑命令编辑的单位是行 行编辑器 edit 在行编辑器中每一条编辑命令编辑的单位是行 而不是字符, 定位点是"当前行"而不是"光标所在 字符". 1. 进入行编的两种方法 ① 从shell 进入行编: $ edit ( 或 e , ex) file 2019年5月4日 aaaaaaaaaaaaaa bbbbbbbbbbbbb ccccccccccccccc ddddddddddddd eeeeeeeeeeeeeee "file" 5lines, 70chars :_ …… % ex file "file" [new file] :_ file已存在 file是新文件
在屏编的命令模式下按冒号(:) 即可进入行编 2019年5月4日 ② 从vi 的屏编状态进入行编: 在屏编的命令模式下按冒号(:) 即可进入行编 111111111 222222222222 33333333 111111111 222222222222 33333333 :_ 屏编命令模式 行编命令模式
退出行编 ① 从行编退回到屏编: v 或 vi 行编状态 回到屏编状态 从行编回到屏编后, 光标停留在行编处理的最后一行的行首 2019年5月4日 退出行编 ① 从行编退回到屏编: aaaaaaaaaa bbbbbbbbbbbb cccc dddddddddd :_ aaaaaaaaaa bbbbbbbbbbbb cccc dddddddddd v 或 vi 行编状态 回到屏编状态 从行编回到屏编后, 光标停留在行编处理的最后一行的行首
② 从行编退回到 shell 状态: :wq 写回(覆盖)原文件, 并退回shell :w filename 写到文件filename 中, 不退出 :w! filename 强行写到文件filename中, 不退出 :q 退出行编辑(不写出), 返回shell :q! 强行退出行编, 返回shell 实际上这也是屏编退出的命令! 2019年5月4日
3. 常用行编命令 (下面m和n为具体数字) :n 把第n行作为当前行(移动到第n行去) :np 显示第n行的内容, 并把第n行作为当前行 :m, np 显示第m行到第n行的内容, 并把第n行作为当 前行 :d 显示当前行, 被删除行的下一行为当前行 :nd 删除第n行的内容, (删除操作后的)第n行为当前 行 :m, nd 删除第m行到第n行的内容, (删除操作后的)第n 行为当前行 :a 在当前行的下一行开始输入文本, 直到ESC键 为止 2019年5月4日
把当前行中的第一个string1字符串替换为字符 串string2 例如: s/student/teacher/ :1,$ 从第一行到最后一行(整个文本) 例如: :1,$p 显示所有文本 :.,$ 从当前行到最后一行 :s/string1/strings2/ 把当前行中的第一个string1字符串替换为字符 串string2 例如: s/student/teacher/ :m,ns/string1/string2/g 把从m行到n行中的所有strings1替换成string2 例如: 5,96s/Sep/Oct/g :r filename 在当前行的后面读入(附加)文件filename的内容 例如: :r func7 :nr filename 在第n行的后面读入(附加)文件filename的内 容 2019年5月4日
vi 命令的其它选项 恢复上次的编辑副本: $ vi -r filename 把上次已被修改过, 但因意外中断而未被保存的文件 2019年5月4日 vi 命令的其它选项 恢复上次的编辑副本: $ vi -r filename 把上次已被修改过, 但因意外中断而未被保存的文件 filename 读入到编辑缓冲区中, 使得编辑工作接着上次 继续进行. 编辑多个文件: $ vi file1 file2 file3 首先编辑第一个文件, 编辑完并用:w 命令保存后用命 令 :n 则开始编辑第二个文件; 依此类推. 编辑加密文件: $ vi -x filename 如果被编辑文件filename 是经过encrypt加密的, 则可使 用 –x 选项在回答了口令后对文本文件进行编辑.
vi除文本编辑之外的功能: 1、在vi中执行unix命令 (!ls) 2、命令行编辑功能 ($set -o vi)