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