第 3 章 UNIX 文本编辑程序
第3章 第2页第3章 第2页 UNIX 的文本编辑程序 常用的文本编辑器 行编辑 ed 全屏幕编辑 vi 使用场合 行编辑 ed 常用于脚本程序中,使用输入重定向 例如:安装软件时,用来修改系统配置文件 vi 用于人机交互式编辑文本文件
第3章 第3页第3章 第3页 vi 的启动方法 命令格式 vi 文件名列表 后边可以指定 0 个或者多个文件 例如 vi try.c
第3章 第4页第3章 第4页 设置 vi 选项( 1 ) vi 有 40 多个选项控制 vi 的运行, 有两种设定方法 使用.exrc 文件 vi 启动时自动读取用户主目录下文件.exrc 获取自设 定的 vi 选项 例如:文件.exrc 中含有如下两行: set number 每一行时,在左边列出行号 set showmode 在屏幕右下角标志出当前状态
第3章 第5页第3章 第5页 设置 vi 选项( 2 ) 在 vi 中键入 set 命令 命令格式 设置选项 :set option 取消选项 :set no option 例如 :set number 每行左边列出行号 :set nonumber 每行左边不列出行号 :set showmode 屏幕右下脚标出当前状态 :set noshowmode 屏幕右下脚不标出当前状态 :set all 列出所有开关的当前状态
第3章 第6页第3章 第6页 vi 的两种工作状态( 1 ) 命令状态:键盘输入解释为命令 vi 一启动就进入命令方式,键盘输入解释为命令 一般按键无回显 以冒号可以引入 ex 命令和查找命令 编辑命令 i a 等,可以从命令状态转到文本状态
第3章 第7页第3章 第7页 vi 的两种工作状态( 2 ) 文本状态 键盘输入解释为输入的文本 可以输入多行,每输入完一行后按回车转入下一行 正文输入时有回显 输入完毕按键盘左上角的 Esc 键,返回到命令状态
基本编辑命令
第3章 第9页第3章 第9页 正文插入 命令 i 在当前字符前插入正文段,直至按 Esc 键 (insert) 命令 a 在当前字符后插入正文段,直至按 Esc 键 (append) 命令 o 在当前行后插入正文段,直至按 Esc 键 (open) 命令 O 在当前行前插入正文段,直至按 Esc 键 (open)
第 3 章 第 10 页 光标单字符移动 单字符移动(四个字母键盘上相邻的按键) h 光标左移一列 j 光标下移一行 k 光标上移一行 l 光标右移一列 有的终端可以直接使用键盘上的方向键代替这四个字母 命令前加一整数,表示这个命令连续执行多少遍 5h 光标左移 5 列 6j 光标下移 6 行 23k 光标上移 23 行 10l 光标右移 10 列 注意:在 vi 命令状态下的按键命令没有回显
第 3 章 第 11 页 翻页 命令 Ctrl-b 向后翻页 (Backward) Ctrl-f 向前翻页 (Forward) Ctrl-u 向上翻半页 (Up) Ctrl-d 向下翻半页 (Down) 注意 vi 把文件尾方向定义为向前,文件头方向定义为向后 有的键盘用 PgDn 键代替 Ctrl-f ,用 PgUp 键代替 Ctrl-b 也可以使用下面的命令 6Ctrl-f 向前翻 6 页 15Ctrl-b 向后翻 15 页
第 3 章 第 12 页 光标行内快速移动 行尾行首 将光标移至当前行首 ^ 将光标移至当前行尾 $ 移动一个单词 移到右一个单词 w W 移到左一个单词 b B 也可以使用 6w 3W 5b 10B 命令 wb 与 WB 区别:对 “ 单词 ” 分界符的定义不同 wb 命令:非字母,数字,下划线之外的字符 WB 命令:仅以空白符(空格 / 制表符 / 回车)
第 3 章 第 13 页 光标移动到指定行 移到指定的行 :476 将光标定位于第 476 行 :1 将光标定位于第 1 行(文件首) :$ 将光标定位于文件尾 :$-10 将光标定位于文件倒数第 10 行 在描述行号时可以使用 圆点(. )代表当前行号, $ 代表最后一行的行号 括号配对 % 把光标移到一个花括号 ( 或圆括号,或方括号 ) 上, 按 % 键,则光标自动定位到与它配对的那一个括号
第 3 章 第 14 页 删除命令和剪贴板 注:被删除的内容进入剪贴版 删除字符 删除当前字符的命令 x 命令 5x 删除从当前光标开始的 5 个字符 删除行 删除当前行的命令 dd 命令 3dd 删除从当前行开始的 3 行 删除块 删除到配对括号命令:将光标定位在括号上 d% 复制到剪贴板 yank( 不删除,只拷贝到剪贴板 ) yy 与 y% paste 取出剪贴板中内容 p
第 3 章 第 15 页 字符替换 替换光标处字符 r ra 命令将当前光标处字符替换为 a 将当前光标处开始的三个字符依次替换为 abc ,则 需要按命令 rarbrc 替换若干字符 R 例:命令 Rabcdef ,然后按 Esc 键 该命令把从当前光标开始的字符依次替换为 abcdef , 用 Esc 来结束多字符替换命令
第 3 章 第 16 页 取消和重复 取消上一次的编辑操作 (undo) u 如:误删了一段正文,用 u 命令可撤销删除 如:把文件中的所有 abc 字符串替换成 xyz 字符串, 用 u 命令可撤销替换 重复上一次的编辑操作. 按圆点键,可以重复上一次的编辑操作 例如:按 3dd 命令删除了三行,然后按圆点键就再 删除三行,接着连续按圆点键,每按一次删三行
第 3 章 第 17 页 文件操作命令 存盘退出 ZZ :wq 存盘不退出 :w 不存盘退出 :q! 读入文件 xyz.c 插入到当前行之下 :r xyz.c 写文件, 把第 50 行至文件尾的内容写到文件 file1 中 :50,$w file1 :50,$w! file1 强制覆盖
第 3 章 第 18 页 块操作 删除,并拷贝到剪贴板 :10,50d 删除第 行 :1,.d 删除文件首至当前行的部分 :.,$d 删除当前行到文件尾 不删除,拷贝到剪贴板 :10,50y 复制 :5,10co56 复制第 5-10 行到第 56 行之下 移动 :8,34m78 移动第 8-34 行到第 78 行之下
第 3 章 第 19 页 行合并、刷屏和状态显示 两行合并 (Join) J 当前行下面的行合并到当前行 刷新屏幕显示 (load) Ctrl-l 状态显示 Ctrl-g 在屏幕最下面一行列出正在编辑的文件的名字,总 行数,当前行号,文件是否被修改过等信息
查找与替换
第 3 章 第 21 页 模式查找 用 “ 正则表达式 ” 来描述一个字符串模式 查找命令 / 格式 /pattern 例: /[0-9][0-9]* 继续查找命令 n 向下查找下一个 next N 向上查找下一个 循环式搜索
第 3 章 第 22 页 模式替换 (1) 替换命令 (substitution) 格式 : n1, n2 s/ pattern / string /g 例 :1,50s/abc/xyz/ :1,50s/abc/xyz/g :50,80s/^// 第 行右移 4 列 :50,80s/^// 第 行左移 4 列 :1,$s/ *$// 消除尾部多余的空格 :1,$s/a[i]/b[j]/g 不能把 a[i] 替换为 b[j] :1,$/a*b/x+y/g
第 3 章 第 23 页 模式替换 (2) 替换字符串中字符 & 代表被模式所匹配的那部分 例 设文件当前只含有 2 行,每行为一个整数,内容为 执行命令 :1,$s/[0-9][0-9]*/ & host&/ host host host10
第 3 章 第 24 页 模式替换中的转义符 尤其是编辑 C 语言源程序时需要 将 a[i]*b[j] 替换为 x[k]*y[n] 的命令 :1,$s/a\[i]\*b\[j]/x[k]*y[n]/g 将 buf.len/1000 替为 buffer.size/1024 的命令 :1,$s/buf\.len\/1000/buffer.size\/1024/g 模式串和替换字符串中的斜线前加转义符 \ 以区别 于替换命令格式中所必须的斜线 将 *pointer 替换为 &record :1,$s/\*pointer/\&record/g
第 3 章 第 25 页 更灵活的替换 (1) 模式描述中增加 \( 和 \) 在正则表达式中圆括号,仍然代表它自身 在正则表达式中出现的 \( 和 \) 不影响匹配操作 例 [a-zA-Z_][a-zA-Z0-9_]*->number \([a-zA-Z_][a-zA-Z0-9_]*\)->number 替换字符串中的 \0 \1 \2 ……
第 3 章 第 26 页 更灵活的替换 (2) 将 “ 变量名 ->number” 替换为 “ 变量名 ->num” :1,$s/\([a-zA-Z_][a-zA-Z0-9_]*\)->number/\1->num/g 将日期格式 “ 月 - 日 - 年 ” 改为 “ 年. 月. 日 ”, 比如:将 替换为 使用命令 : :1,$s/\([0-9][0-9]\)-\([0-9][0-9]\)-\([0-9][0-9]*\)/\3.\1.\2/g 替换字符串中的 & 可以用 \0 代替 :1,$s/[0-9][0-9]*/ & host&/ 也可以用 :1,$s/[0-9][0-9]*/ \0 host\0/
第 3 章 第 27 页 其他软件中的应用 其他软件也使用正则表达式实现灵活的字符串 匹配与替换 UNIX 命令 ed , sed , expr Cisco 路由器的 IOS 配置 Windows 的 Visual C++ 的编辑器 不同软件中的正则表达式定义可能会有些差别