二、常见问题及应用技巧
---- 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,显示文件结尾的行号。 ---- :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”实现,其中“”是转义字符,表明其后的“/”字符是具有实际意义的字符,不是分隔符。 |
:ab string strings
例如 ":ab usa United States of America" , 当你在文见里插入 usa 时 United States of America 就蹦出来了 :g/^/m0 把文件内容反转 :map keys new_seq 定义你当前 键盘命令 :set [all] vi or ex 的编辑状态 如 显示每行 :set nu :X 然后系统会提示输入密码, 输入密码后存盘退出, 保存后就加密了 下次编辑时使用vi -x filename, 系统会提示你输入密码 在命令状态下,nyy表示拷贝从光标行起的下n行内容,p表示paste,粘贴下来在光标处。 我常用到的单个字符替换用r,覆盖多个字符用R,用多个字符替换一个字符用s,整行替换用S :%s/old_word/new_word/g 这个指令是于在整个文件中替换特定字符串 将光标移到第n行,按下 mk 将光标移到第m行,按下 "ay'k 即将第n到m的行存到a寄存器,以此类推,b,c........寄存器等 不好意思,补充一下,想粘贴到某处,直接将光标移到某地,按下 ‘ap 即可 删除命令操作 d l 删除当前字符(与x命令功能相同) d 0 删除到某一行的开始位置 d ^ 删除到某一行的第一个字符位置(不包括空格或TA B字符) d w 删除到某个单词的结尾位置 d 3 w 删除到第三个单词的结尾位置 d b 删除到某个单词的开始位置 d W 删除到某个以空格作为分隔符的单词的结尾位置 d B 删除到某个以空格作为分隔符的单词的开始位置 删除命令操作 d 7 B 删除到前面7个以空格作为分隔符的单词的开始位置 d) 删除到某个语句的结尾位置 d 4) 删除到第四个语句的结尾位置 d( 删除到某个语句的开始位置 d } 删除到某个段落的结尾位置 d { 删除到某个段落的开始位置 d 7 { 删除到当前段落起始位置之前的第7个段落位置 d d 删除当前行 d /t e x t 删除从文本中出现“ t e x t”中所指定字样的位置,一直向前直到下一个该字样所出现的 位置(但不包括该字样)之间的内容 d fc 删除从文本中出现字符“c”的位置,一直向前直到下一个该字符所出现的位置(包括 该字符)之间的内容 d tc 删除当前行直到下一个字符“ c”所出现位置之间的内容 D 删除到某一行的结尾 d $ 删除到某一行的结尾 5 d d 删除从当前行所开始的5行内容 d L 删除直到屏幕上最后一行的内容 d H 删除直到屏幕上第一行的内容 d G 删除直到工作缓存区结尾的内容 d 1 G 删除直到工作缓存区开始的内容 修改命令操作 c l 更改当前字符 c w 修改到某个单词的结尾位置 c 3 w 修改到第三个单词的结尾位置 c b 修改到某个单词的开始位置 c W 修改到某个以空格作为分隔符的单词的结尾位置 c B 修改到某个以空格作为分隔符的单词的开始位置 c 7 B 修改到前面7个以空格作为分隔符的单词的开始位置 c 0 修改到某行的结尾位置 c) 修改到某个语句的结尾位置 c 4) 修改到第四个语句的结尾位置 c( 修改到某个语句的开始位置 c } 修改到某个段落的结尾位置 c { 修改到某个段落的开始位置 c 7 { 修改到当前段落起始位置之前的第7个段落位置 c tc 修改当前行直到下一个字符c所出现位置之间的内容 C 修改到某一行的结尾 c c 修改当前行 5 c c 修改从当前行所开始的5行内容 替换命令操作 s 将当前字符替换为一个或多个字符 S 将当前行替换为一个或多个字符 5 s 将从当前字符开始的5个字符替换为一个或多个字符 下载 vi替换使用规则: :g/s1/s/s2/s3/g 第一个g表示对每一个包括s1的行都进行替换,第二个g表示对每一行包括s1的行所有的s2都用s3替换 s表示替换,s2是要被替换的字符串,他可以和s1相同(如果相同的话用//代替),s3是替换字符串 fx 往右移动到 x 字符上 Fx 往左移动到 x 字符上 tx 往右移动到 x 字符前 Tx 往左移动到 x 字符后 (注意:以上四个命令中,其中x是键入的字符) ; 分号,配合 f 和 t 使用,重复一次 , 逗号,配合 f 和 t 使用,反方向重复一次 建议谁把 :set all 出来的参数及其用法说明一下。注意注明UNIX平台,我发现几个平台下有些差异。 加密码我在8 上(bsh) 实验成功 所以大家最好还是加上 环境!! vi 环境选项 Solaris ksh noautoindent nomodelines noshowmode autoprint nonumber noslowopen noautowrite nonovice tabstop=8 nobeautify nooptimize taglength=0 directory=/var/tmp paragraphs=IPLPPPQPP LIpplpipnpbtags=tags /usr/lib/tags noedcompatible prompt tagstack noerrorbells noreadonly term=vt100 noexrc redraw noterse flash remap timeout hardtabs=8 report=5 ttytype=vt100 noignorecase scroll=11 warn nolisp sections=NHSHH HUuhsh+c window=23 nolist shell=/bin/ksh wrapscan magic shiftwidth=8 wrapmargin=0 mesg noshowmatch nowriteany For C-Shell: setenv EXINIT "set nu" For Bourne or Korn Shell: EXINIT="set nu"; export EXINIT For Korn Shell Only (alternate method): typeset -x EXINIT="set nu" 在 .profile 里设置 vi 的环境选项 , 以上均测试过 怎么没有介绍标记的,做标记对那种大的程序文件阅读十分有帮助。 建议大家使用。 标记文本 mchar 用字母char标记当前光标的位置 `char 移至char所标记处 'char 移至char标记所在行的开头处 " 移至当前行上一次所在位置(在光标移动之后)――一个双引号 '' 移至当前行上第一次所在位置的行的开头处(在光标移动之后)――两个单引号 .重复上一次修改! 大家都说了这么多了,我也来说两句 在当前屏幕中 H 跳到第一行 M 跳到中间一行 L 跳到最后一行 同时vi多个文件时,CTRL-SHIFT-6回到上一个文件,在本次vi的文件和上次vi的文件之间切换。其实就是一些文档写的 ^^ 但是我发现一个BUG:在用CTRL-SHIFT-6切换到上一个文件后,用:args查看多文件vi状态时,屏幕底部仍然显示目前vi的是刚才的文件。 (在HP-UX,Solaris,AIX上通过) 还是使用 :e# 切换比较好,呵呵 %s/^/要加的内容/g 要在文本后同样的字符加 %s/$/要加的内容/g vi的使用确实太多,大家多多总结交流!!! 追加到缓冲区 对于已经有内容的缓冲区,可以继续追加内容在其后面,例如: "Ad4w 删除光标后4个字,并附加到缓冲区a "Ay) 取样从光标到文件尾的内容,并附加到缓冲区a "K3yy 取样从光标所在行起的3行内容,并附加到缓冲区k 注意:在追加缓冲区的命令中,原缓冲区的名字一定要大写,才能将内容追加进去,否则是覆盖原缓冲区的内容。追加内容在原缓冲区末尾另起一行。 清理掉DOS文本中的^M可以在:1,$s/^M//g,其中^M是CTRL+V, CTRL+M。 删除从当前行开始到最后一行的所有内容 :.,$d 在:命令行模式下,首先可以确定命令的范围 .表示当前行;数字表示行号,如1表示第一行,2表示第二行;$表示最后一行 范围用,分隔 然后用命令 d表示删除,y表示复制......大家都知道的 最后说一句,%表示全文 :%d 是删除全文 给“南非蜘蛛”补充一下,hehe 在:命令行模式下,首先可以确定命令的范围 .表示当前行;数字表示行号,如1表示第一行,2表示第二行;$表示最后一行 范围用,分隔 ... 慎用:$d :$d 只是删除最后一行嘛,用错了还不算最坏的结果,呵呵 请教aix,ksh下: 一行>=2048个字符时,无法显示,怎么办? 在vi中好像应该没有什么办法了,这是vi的Program Limits中的Maximum Line Length限制。试一试用UltraEdit读读看吧 有的环境不能用uedit 可以折行吗? 折行 :set wrapmargin=4 下面引用由bjchenxu在 2002/09/05 09:07am 发表的内容: 折行 :set wrapmargin=4 怎么解释?结果如何? 不行呀 A line cannot be longer than 2048 characters. 我的只能解决显示问题,如果说vi里不能存放这么多字符,就比较麻烦了 另外问一句,2048个字符已经够长了,为什么要放更多的,没准我们可以从源头上解决问题 老外的程序的log文件,有些行就这么长,以至于影响了后面行的显示; more,pg等可以折行 我还是不会用:X加密,能不能说的详细一点,:X后,提示输入key:然后呢?mark what 后输入什么呢,下次如何在打开呢?more 可以正常看吗? xiexie! 你使用的什么平台的UNIX呢?我从来没有见到mark what出现过啊 more是不能正常看的,用vi -x filename,然后输入密码就可以了 好像再另存不了不加密的了 用 :wq 或者 :wq! 另存 请高手指点迷精:vi中如何在每行的倒数第二个字符处插入一个字符?? 把Tab全部换成回车,应该怎么作啊? :1,$ s/ / /g 不行 ^M (Ctrl+V+M)就是回车。 vi加密不同的unix可能不同. 俺在HP-UX下,用X加密的文件只输key(密钥). vi -C 文件名,便会要求输入密钥,如正确,便打开了. littletiger的意思是不是这样: 以HP-UX为例 1、加密 vi file :X (Are you sure?(y/n)[n]:)回答y 输入密码回车以后再保存,就加密成功了 2、解密 vi -C file 或者 vi -x file 在 Key: 后面输入密码进入file :X (Are you sure?(y/n)[n]:)回答y 直接回车以后再用 wq 或者 wq! 保存,就把file解密成功了 :set number 显示行号 :g/$/s// ABC/g :g/^/s//def /g 在文本每行的头和尾添加字符串. 用vi进行coding时的使用技巧: 用ctags命令对当前目录下的c源程序扫描,生成tags文件 $ ctags *.c 这样,在vi里通过命令 :ta fun_name 就可以直接打开函数fun_name所在的文件,并将光标置于函数开头 :n,n1 d n和n1都是行数, d是删除这些行 .表示当前的行。 : n n是行数,直接转到n行。 : r 文件名 把文件添加到当前的文件中 :n,n1 w 文件名 把从n行到n1行写道另外一个文件中 查找: 在一个单词上用*,就向下查找此单词,#是向上 用/查找hello,就不会查找到hello_world(用此替换也很好用) 替换: 如有一文件,内容为: aa bb cc dd 用:%s/.*/printf("& is :%d ",&)/ 文件内容为变为: printf("aa is :%d ",aa) printf("bb is :%d ",bb) printf("cc is :%d ",cc) printf("dd is :%d ",dd) &为查找到的内容 用:~为重复上一次替换 用系统命令编辑: 如有一文件,内容为: 333 222 334 444 111 553 554 233 运行命令:%!sort 文件内容为: 111 222 233 333 334 444 553 554 用此方法可以使用许多系统命令进行编辑,大家可以灵活运用 其他特殊用法: 用q: 看一看有什么 用? 可以编辑你用过的命令 程序中在一个调用函数(如:printf)上用K,可以直接调出printf的帮助 ctrl+f向下翻页,ctrl+b向上翻页(对于telnet上去的时候比较有用) 1. vi中设置tab键的空格数: :set ts=4 :set sw=4 将此两句话加到当前用户目录的文件.vimrc中,这样当前用户用vi的时候就会启动该设置 2.拷贝: 将第2行到第9行的字copy到第11行 :2,9 co 10 将第2行到第9行的字move到第11行 :2,9 m 10 3.设置行号: :se nu 取消行号: :se nonu 4.当前行与下一行换位置:ddp 5.当前字与后面的字换位置:xp 用vi替换文件中的字符串 在vi界面下使用命令 :%s#/usr/bin#/bin#g 可以把文件中所有路径/usr/bin换成/bin。也可以使用命令: :%s/usr/bin/bin/g 其中“”是转义字符,表明其后的“/”字符是具有实际意义的字符,不是分隔符。 请问 vi 中的删除缓冲区是怎么回事? 看到有一个资料说到: “vi还有有编号的删除缓冲区。撤消命令只能恢复上一次的删除,当且仅当这个删除是最后一次操作。但是,vi可以把最近9次删除的内容都放入9个编号从1到9的缓冲区内。最近一次删除保存在缓冲区1,次近的在缓冲区2,依此类推。例如,"2p可以放置第二个删除缓冲区中的内容。” 但是我没有操作成功,请教各位。 既然是vi的问题,我义不容辞 准备文件test 1 2 3 4 5 将光标定位在5上,连按5次dd 然后键入 "5p "4p "3p "2p "1p 看看发生了什么 明白了? 要注意" 谢谢你们的解释! 再问,是否只有删除的整行可以保存在删除缓冲区中?比如删除的字符呢? 字符也可以,用整行只是为了让你好学 自己试试吧,找葫芦画瓢吧 wo 我照呢说得作的 可是恢复的是5个1 啊 怎么回事 (solaris8) 比如在一行中连按5次dw,会将5个词依次放入1~5的寄存器中吗?我没有试验成功,总提示寄存器为空。 [这个贴子最后由goodboy在 2002/08/22 09:29am 编辑] bjchenxu,能否把VI使用高级技巧的方法给大家讲一讲呀:) 很多的,比如:怎么一个文件中的几行保存到另外一个文件中了, 或者把另外一个文件的插入到指定内容的行后面了或者我在vi中拷贝 A文件的某5行(Esc下5yy拷贝),然后再:e b文件,怎么把A文件的5行拷过来? 然后又怎么回到原先的A文件中? 高级技巧太多太多,建议大家找本版valentine斑竹要书看,呵呵 你说的几个问题我先回答一下: 1. 将一个文件中的几行保存到另外一个文件中了 1.1 $vi file1 1.2 :3,5 y a 1.3 :e file2 1.4 "ap 2. 将另外一个文件插入到指定内容的行后面 2.1 $vi file1 2.2 :/regularexpress/ r file2 3. 两个文件的切换和拷贝 3.1 $vi file1 file2 3.2 :3,5 y a 3.3 :e# 3.4 "ap 3.5 :e# 在vim里面查看man页面 在进入vim后按“:”号,输入 source $VIMRUNTIME/ftplugin/man.vim 然后再按“:”号,输入 nmap K :Man 然后在vim里面输入你要的命令,在这个命令上按K,就可以看到经vim处理过后的man页。 用vi在整个文件的各行或某几行的行首或行尾加一些字符串 $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。 用vi删除大段的内容 首先利用编辑命令“vi file”打开文件, 然后将光标移到要删除的行处按Ctrl+G显示行 号,再到结尾处再按Ctrl+G,显示文件结尾的行号。 例如: :23,1045d 假定2次得到的行号为23和1045,则把这期间的内容全删除, 也可以在要删除的开始行和 结束行中用ma、mb命令标记,然后利用“:'a,'bd”命令删除。 用vi实现“另存为”功能 $vi file :w /tmp/1 保存所做的所有修改,也可以将其中的某一部分修改保存到临时文件。 如果仅仅把第20~59行之间的内容存盘成文件/tmp/1,我们可以键入如下命令: :20,59w /tmp/1 用vi在一个新文件中读其他文件的内容 $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 '^#' 用vi拷贝一个文件中的文本并粘贴到另一个文件中 $vi file1 file2 然后在vi界面下: yy <-在文件1的光标处拷贝所在行 :n <-切换到文件2 (n=next) p <-在文件2的光标所在处粘贴所拷贝的行 :n <-切换回文件1 使用vim对被编辑文件加密 在VIM当中要对所编辑的文件进行简单加密,可以在命令行模式下键入“:X”(无括号, 只有冒号和X)然后在提示“Enter the encrypt key”时输入口令字串就可以加密了。但是别 忘了要保存哦!保存的时候会发现在屏幕底部有“[crypted]”这样的字样。 下次打开该加密 文件会要求您输入口令字串,这个总该记得的吧? 设置vim自动显示行号 在每个用户的主目录下,都有一个 vi 的配置文件".vimrc"或".exrc", 用户可以编辑它, 使这些设置在每次启动 vi 时,都有效。 例如,加入如下设置行: set nu 显示行号 set nonu 不显示行号 set ic 查找时不考虑大小写 set noic 查找时考虑大小写 在vi里搜索关键字 当你用vi打开一个文件后,因为文件太长,如何才能找到你所要查找的关键字呢?在vi里 可没有菜单-〉查找,不过没关系,你在命令模式下敲斜杆(/)这时在状态栏(也就是屏幕左下 角)就出现了 “/”然后输入你要查找的关键字敲回车就可以了。 如果你要继续查找此关键字,敲字符n就可以继续查找了。值得注意的是“/”是向下查找, 而“?”是向上查找,而在键盘定义上“?”刚好是“/”的上档符。 用彩色的vi写程序 修改$HOME中的.vimrc,把color值设为true 把环境变量VIMRUNTIME设成vim的路径名 例:/usr/share/vim 在vi中键入 :syntax on回车 :so $VIMRUNTIME/syntax/java.vim回车(现在版本的vi支持无数程序语法色彩档,都在 syntax/下,看一眼吧:)) 如果不喜欢所用的xterm背景色,可以用xterm -bg LightBlue(或其他喜欢的颜色)启动, 或者修改.Xresouce的xterm background项。 vi -o xxx.java xxxx.java vi 例如:Esc键在vi中输入ctrl+v与Esc为^[ 请问Delete键在vi中如何输入? d 空一行 [Ctrl+V][Del] 输这个键有什么用啊 输不进去 我想在shll里自动telnet到另一台机器终止.profile(自动运行了程序)执行,好执行我在shll中的一些命令。 输不进去 这种情况是因为DEL在您的终端上被定义成某个中断键,中断是被操作系统优先处理的。 使用stty -a 可以显示出DEL被哪个中断所用。 以下是两种解决方法: 1。使用“stty 中断名 新的中断键”形式改变中断键设置,然后调用vi,再使用ctrl+V的方法。如:stty intr ^E;vi 2。使用一个shell脚本myvi:stty raw ;vi $*;stty -raw 调用myvi 还有一种变通的解决方法,DEL键的ascii码应该是^?,0x7f, |