linux社区爱心援助Linux认证系列教程业界动态站务新闻公司招聘建议留言网址大全LPI专题CISCO专题
设为首页
加入收藏
管理团队
JSP  
JAVA  
PERL  
 您的位置:首页 > article > Linux入门与提高 > 使用与技巧 >
栏目导栏
资料搜索
热门文章
·VMware Tools的安装步骤
·应用Linux下两种中文输入法
·GRUB FOR DOS 引导安装LINUX和
·linux下BT软件介绍
·Linux中用ALSA驱动声卡流程详解
·Linux 170个常见问题的详细解答
·什么是ISO文件?
·虚拟机软件vmware使用教程--使
·BabyLinux制作过程详解
·Linux挂接(mount)命令的使用方
·Linux必学的网络操作命令
·ffmpeg命令使用详解
·Linux操作系统Ifconfig命令详细
·在Linux下制作工资表
·vmware下的fedora 6的vmware t
最新文章
·CentOS5安装apache和svk使用域
·Ubuntu Linux系统Sudo命令无效
·Uboot对非Linux kernel的引导
·Fedora和XP双系统中网卡Realte
·解决Linux操作系统下部分文件乱
·双系统安装Linux之后找不到Win
·Linux操作系统上安装Flash Med
·设置Tomcat在Linux操作系统中自
·Linux操作系统下创建DBCA报错的
·Redhat Enterprise Linux磁带机
·Linux系统下用一条命令批量修改
·实用技巧:Linux下命令排列、调
·关于Linux操作系统中VI编辑器字
·Linux VI编辑器中的复制与粘贴
·Linux系统下触摸屏的简单使用和
Google
 
vi编辑器的使用方法
[ 作者:小猪@BSD  加入时间:2007-02-08 09:57:04  来自:chinaunix ]
一:简介:i2dLinux联盟
Vi命令可以说是Unix/Linux世界里最常用的编辑文件的命令了,很多人不喜欢VI因为它i2dLinux联盟
的众多的命令集,但是我们只需要掌握基本的命令然后灵活地加以运用,相信你会象我一i2dLinux联盟
样喜欢它的。i2dLinux联盟
本文旨在更有条理有归纳性地介绍VI的一些最常用命令和一些高级的应用。i2dLinux联盟
i2dLinux联盟
二:基本命令介绍:i2dLinux联盟
1) 光标命令i2dLinux联盟
k,j,h,l---上下左右光标移动命令,虽然你可以在Linux中使用键盘右边的四个光标键,i2dLinux联盟
但是记住这四个命令还有非常有用的,也就是右手在键盘上放置的位置部分i2dLinux联盟
nG ----n为行数,该命令立即使光标跳到指定行。i2dLinux联盟
Ctrl+G-----光标所在位置的行数和列数报告i2dLinux联盟
w,b------使光标向前或向后跳过一个单词i2dLinux联盟
i2dLinux联盟
2) 编辑命令i2dLinux联盟
i,a,r -------在光标的前,后,上方插入字符命令(i=insert,a=append,r=replace)i2dLinux联盟
cw,dw------ 改变(置换)/删除光标所在处的单词的命令 (c=change,d=delete)i2dLinux联盟
x,d$,dd -----删除一个字符,光标所在处到行尾的所有字符,和整行的命令i2dLinux联盟
i2dLinux联盟
3) 查找命令i2dLinux联盟
/string, ?string-----从光标所在处向后/向前查找相应的字符串的命令i2dLinux联盟
i2dLinux联盟
4)拷贝复制命令i2dLinux联盟
yy,p -----拷贝一行到剪贴板/取出剪贴板中内容的命令i2dLinux联盟
i2dLinux联盟
三:常见问题及应用技巧i2dLinux联盟
1) 在一个新文件中读/etc/passwd中的内容,取出用户名部分i2dLinux联盟
vi filei2dLinux联盟
:r /etc/passwd 在打开的文件file中光标所在处读入/etc/passwdi2dLinux联盟
:%s/:.*//g 删除/etc/passwd中用户名后面的从冒号开始直到行尾的所有部分i2dLinux联盟
:3r /etc/passwd 这是在指定的行号后面读入文件内容i2dLinux联盟
i2dLinux联盟
另外一种方法删掉文件中所有的空行及以#开始的注释行i2dLinux联盟
#cat squid.conf.default | grep -v '^$' | grep -v '^#'i2dLinux联盟
i2dLinux联盟
i2dLinux联盟
2) 在打开一个文件编辑后才知道登录的用户对该文件没有写权,不能存盘i2dLinux联盟
vi filei2dLinux联盟
:w /tmp/1 既然没法存盘,不想放弃所做的所有修改,先临时存到/tmp/1i2dLinux联盟
:20,59w /tmp/1 或者仅仅把第20到59行之间的内容存盘成文件/tmp/1i2dLinux联盟
i2dLinux联盟
3) 用VI编辑一个文件,但需要删除大段大段的内容i2dLinux联盟
vi filei2dLinux联盟
Ctrl+G 把光标移到需要删除的行的处按ctrl+G显示行号,再到结尾处再按Ctrl+G.i2dLinux联盟
:23,1045d 假定两次行号为23和1045,则把这几间的内容全删除i2dLinux联盟
i2dLinux联盟
也可以在开始和结束两行中用ma,mb命令标记后用:'a,'bd删除.i2dLinux联盟
i2dLinux联盟
4) 在整个文件或某几行中在行首或行尾加一些字符串i2dLinux联盟
vi filei2dLinux联盟
:3,$s/^/some string / 在文件的第一行至最后一行的行首前插入some stringi2dLinux联盟
:%s/$/ some string/g 在整个文件每一行的行尾添加 some stringi2dLinux联盟
i2dLinux联盟
:%s/string1/string2/g 在整个文件中替换string1成string2i2dLinux联盟
:3,7s/string1/string2/ 仅替换文件中的第三到七行中的string1成string2i2dLinux联盟
i2dLinux联盟
i2dLinux联盟
Note: s为substitute,%表示所有行,g表示globali2dLinux联盟
i2dLinux联盟
5) 同时编辑两个文件,在两个文件中拷贝剪贴文本i2dLinux联盟
vi file1 file2i2dLinux联盟
yy 同时打开两个文件,在文件1的光标所在处拷贝所在行i2dLinux联盟
:n 切换到文件2 (n=next)i2dLinux联盟
p 在文件2的光标所在处粘贴所拷贝的行i2dLinux联盟
:N 切换回文件1i2dLinux联盟
i2dLinux联盟
i2dLinux联盟
6) 替换文件中的路径i2dLinux联盟
i2dLinux联盟
:%s#/usr/bin#/bin#g 把文件中所有路径/usr/bin换成/bini2dLinux联盟
或者用i2dLinux联盟
:%s//usr/bin//bin/g 在'/'前用符号指出'/'是真的单个字符'/'i2dLinux联盟
i2dLinux联盟
鉴于大家在使用VI 的时候有一定的陌生,在这里借花献佛,从兄弟版[SHELL]中整理出以下关于VI编程的高级技巧,希望对大家学习UNIX有所帮助,并希望大家能结合使用HPUX的心得体会对这些经验进行进一步的扩展。i2dLinux联盟
i2dLinux联盟
1.交换两个字符位置i2dLinux联盟
i2dLinux联盟
xpi2dLinux联盟
2.上下两行调换i2dLinux联盟
ddpi2dLinux联盟
3.把文件内容反转i2dLinux联盟
:g/^/m0/ (未通过)i2dLinux联盟
i2dLinux联盟
4.上下两行合并i2dLinux联盟
Ji2dLinux联盟
5.删除所有行i2dLinux联盟
dGi2dLinux联盟
6.从当前位置删除到行尾i2dLinux联盟
d$i2dLinux联盟
7.从当前位置复制到行尾i2dLinux联盟
y$ 如果要粘贴到其他地方 p 就可以了i2dLinux联盟
i2dLinux联盟
i2dLinux联盟
由于vi 是建立在 EX 上的 所以 当键入 : 时就来到了 EX 命令状态i2dLinux联盟
8.i2dLinux联盟
:ab string stringsi2dLinux联盟
例如 ":ab usa United States of America" ,i2dLinux联盟
当你在文见里插入 usa 时i2dLinux联盟
United States of America 就蹦出来了i2dLinux联盟
9.i2dLinux联盟
:map keys new_seqi2dLinux联盟
定义你当前 键盘命令i2dLinux联盟
10.i2dLinux联盟
:set [all]i2dLinux联盟
vi or ex 的编辑状态i2dLinux联盟
如 显示每行 :set nui2dLinux联盟
11.i2dLinux联盟
在命令状态下,nyy表示拷贝从光标行起的下n行内容,p表示paste,可刚复制的内容粘贴在光标处的i2dLinux联盟
下面。i2dLinux联盟
i2dLinux联盟
12.i2dLinux联盟
单个字符替换用r,覆盖多个字符用R,用多个字符替换一个字符用s,整行替换用Si2dLinux联盟
i2dLinux联盟
13.i2dLinux联盟
i2dLinux联盟
:%s/old_word/new_word/gi2dLinux联盟
这个指令是于在整个文件中替换特定字符串i2dLinux联盟
i2dLinux联盟
14.光标控制i2dLinux联盟
i2dLinux联盟
k:上移 nk 上移n行i2dLinux联盟
j:下移 nj 下移n行i2dLinux联盟
i2dLinux联盟
i2dLinux联盟
将光标移到第n行,按下 mki2dLinux联盟
将光标移到第m行,按下 "ay'ki2dLinux联盟
即将第n到m的行存到a寄存器,以此类推,b,c........寄存器等i2dLinux联盟
i2dLinux联盟
这样就可以将你常用的需要复用的内容粘贴到不同的寄存器中以备用i2dLinux联盟
i2dLinux联盟
i2dLinux联盟
想粘贴到某处,直接将光标移到某地,按下 ‘ap 即可,以此类推,b,c........寄存器等i2dLinux联盟
i2dLinux联盟
在当前屏幕中i2dLinux联盟
H 跳到第一行i2dLinux联盟
M 跳到中间一行i2dLinux联盟
L 跳到最后一行i2dLinux联盟
i2dLinux联盟
15.i2dLinux联盟
表8-2 删除命令i2dLinux联盟
删除命令操作i2dLinux联盟
d l 删除当前字符(与x命令功能相同)i2dLinux联盟
d 0 删除到某一行的开始位置i2dLinux联盟
d ^ 删除到某一行的第一个字符位置(不包括空格或TA B字符)i2dLinux联盟
d w 删除到某个单词的结尾位置i2dLinux联盟
d 3 w 删除到第三个单词的结尾位置i2dLinux联盟
d b 删除到某个单词的开始位置i2dLinux联盟
d W 删除到某个以空格作为分隔符的单词的结尾位置i2dLinux联盟
d B 删除到某个以空格作为分隔符的单词的开始位置i2dLinux联盟
d 7 B 删除到前面7个以空格作为分隔符的单词的开始位置i2dLinux联盟
d) 删除到某个语句的结尾位置i2dLinux联盟
d 4) 删除到第四个语句的结尾位置i2dLinux联盟
d( 删除到某个语句的开始位置i2dLinux联盟
d } 删除到某个段落的结尾位置i2dLinux联盟
d { 删除到某个段落的开始位置i2dLinux联盟
d 7 { 删除到当前段落起始位置之前的第7个段落位置i2dLinux联盟
d d 删除当前行i2dLinux联盟
d /t e x t 删除从文本中出现“ t e x t”中所指定字样的位置,一直向前直到下一个该字样所出现的i2dLinux联盟
位置(但不包括该字样)之间的内容i2dLinux联盟
d fc 删除从文本中出现字符“c”的位置,一直向前直到下一个该字符所出现的位置(包括i2dLinux联盟
该字符)之间的内容i2dLinux联盟
d tc 删除当前行直到下一个字符“ c”所出现位置之间的内容i2dLinux联盟
D 删除到某一行的结尾i2dLinux联盟
d $ 删除到某一行的结尾i2dLinux联盟
5 d d 删除从当前行所开始的5行内容i2dLinux联盟
d L 删除直到屏幕上最后一行的内容i2dLinux联盟
d H 删除直到屏幕上第一行的内容i2dLinux联盟
d G 删除直到工作缓存区结尾的内容i2dLinux联盟
d 1 G 删除直到工作缓存区开始的内容i2dLinux联盟
i2dLinux联盟
修改命令操作i2dLinux联盟
c l 更改当前字符i2dLinux联盟
c w 修改到某个单词的结尾位置i2dLinux联盟
c 3 w 修改到第三个单词的结尾位置i2dLinux联盟
c b 修改到某个单词的开始位置i2dLinux联盟
c W 修改到某个以空格作为分隔符的单词的结尾位置i2dLinux联盟
c B 修改到某个以空格作为分隔符的单词的开始位置i2dLinux联盟
c 7 B 修改到前面7个以空格作为分隔符的单词的开始位置i2dLinux联盟
c 0 修改到某行的结尾位置i2dLinux联盟
c) 修改到某个语句的结尾位置i2dLinux联盟
c 4) 修改到第四个语句的结尾位置i2dLinux联盟
c( 修改到某个语句的开始位置i2dLinux联盟
c } 修改到某个段落的结尾位置i2dLinux联盟
c { 修改到某个段落的开始位置i2dLinux联盟
c 7 { 修改到当前段落起始位置之前的第7个段落位置i2dLinux联盟
c tc 修改当前行直到下一个字符c所出现位置之间的内容i2dLinux联盟
C 修改到某一行的结尾i2dLinux联盟
c c 修改当前行i2dLinux联盟
5 c c 修改从当前行所开始的5行内容i2dLinux联盟
i2dLinux联盟
i2dLinux联盟
.重复上一次修改!i2dLinux联盟
i2dLinux联盟
表8-4 替换命令i2dLinux联盟
替换命令操作i2dLinux联盟
s 将当前字符替换为一个或多个字符i2dLinux联盟
S 将当前行替换为一个或多个字符i2dLinux联盟
5 s 将从当前字符开始的5个字符替换为一个或多个字符i2dLinux联盟
i2dLinux联盟
i2dLinux联盟
vi替换使用规则:i2dLinux联盟
:g/s1/s/s2/s3/gi2dLinux联盟
第一个g表示对每一个包括s1的行都进行替换,第二个g表示对每一行包括s1的行所有的s2都用s3替换i2dLinux联盟
s表示替换,s2是要被替换的字符串,他可以和s1相同(如果相同的话用//代替),s3是替换字符串i2dLinux联盟
i2dLinux联盟
i2dLinux联盟
16.i2dLinux联盟
i2dLinux联盟
fxi2dLinux联盟
往右移动到 x 字符上i2dLinux联盟
Fxi2dLinux联盟
往左移动到 x 字符上i2dLinux联盟
txi2dLinux联盟
往右移动到 x 字符前i2dLinux联盟
Txi2dLinux联盟
往左移动到 x 字符后i2dLinux联盟
(注意:以上四个命令中,其中x是键入的字符)i2dLinux联盟
;i2dLinux联盟
分号,配合 f 和 t 使用,重复一次i2dLinux联盟
,i2dLinux联盟
逗号,配合 f 和 t 使用,反方向重复一次i2dLinux联盟
i2dLinux联盟
17. vi 环境选项 Solaris kshi2dLinux联盟
i2dLinux联盟
noautoindent nomodelines noshowmodei2dLinux联盟
autoprint nonumber noslowopeni2dLinux联盟
noautowrite nonovice tabstop=8i2dLinux联盟
nobeautify nooptimize taglength=0i2dLinux联盟
directory=/var/tmp paragraphs=IPLPPPQPP LIpplpipnpbtags=tags /usr/lib/tagsi2dLinux联盟
noedcompatible prompt tagstacki2dLinux联盟
noerrorbells noreadonly term=vt100i2dLinux联盟
noexrc redraw notersei2dLinux联盟
flash remap timeouti2dLinux联盟
hardtabs=8 report=5 ttytype=vt100i2dLinux联盟
noignorecase scroll=11 warni2dLinux联盟
nolisp sections=NHSHH HUuhsh+c window=23i2dLinux联盟
nolist shell=/bin/ksh wrapscani2dLinux联盟
magic shiftwidth=8 wrapmargin=0i2dLinux联盟
mesg noshowmatch nowriteanyi2dLinux联盟
i2dLinux联盟
For C-Shell:i2dLinux联盟
setenv EXINIT "set nu"i2dLinux联盟
For Bourne or Korn Shell:i2dLinux联盟
EXINIT="set nu"; export EXINITi2dLinux联盟
For Korn Shell Only (alternate method):i2dLinux联盟
typeset -x EXINIT="set nu"i2dLinux联盟
在 .profile 里设置 vi 的环境选项 , 以上均测试过i2dLinux联盟
i2dLinux联盟
i2dLinux联盟
18.标记文本i2dLinux联盟
i2dLinux联盟
  mchar   用字母char标记当前光标的位置i2dLinux联盟
  `char   移至char所标记处i2dLinux联盟
  'char   移至char标记所在行的开头处i2dLinux联盟
  "     移至当前行上一次所在位置(在光标移动之后)――一个双引号i2dLinux联盟
  ''    移至当前行上第一次所在位置的行的开头处(在光标移动之后)――两个单引号i2dLinux联盟
i2dLinux联盟
i2dLinux联盟
19.i2dLinux联盟
同时vi多个文件时,CTRL-SHIFT-6回到上一个文件,在本次vi的文件和上次vi的文件之间切换。i2dLinux联盟
但是我发现一个BUG:在用CTRL-SHIFT-6切换到上一个文件后,用:args查看多文件vi状态时,i2dLinux联盟
屏幕底部仍然显示目前vi的是刚才的文件。i2dLinux联盟
(在HP-UX,Solaris,AIX上通过)i2dLinux联盟
i2dLinux联盟
也可以使用:i2dLinux联盟
:e#i2dLinux联盟
进行切换i2dLinux联盟
i2dLinux联盟
20.i2dLinux联盟
sco 下VI 要在文本前同样的字符加用i2dLinux联盟
%s/^/要加的内容/g 要在文本后同样的字符加i2dLinux联盟
%s/$/要加的内容/gi2dLinux联盟
i2dLinux联盟
21.i2dLinux联盟
如何去掉文本中的 ^M 硬回车?不必用binary传回去再ascii传回来的方式,用shell或者unix语句实现。i2dLinux联盟
i2dLinux联盟
cat filename |tr -d '15' >newfilei2dLinux联盟
不同的unix系统还存在一些其他不同的命令,如:doscpi2dLinux联盟
sed 也可以实现这个功能.i2dLinux联盟
i2dLinux联盟
dos2unix filename filename2i2dLinux联盟
反之i2dLinux联盟
unix2dos filename filename2i2dLinux联盟
i2dLinux联盟
在vi 中用:$s/^M//gi2dLinux联盟
^是crtl-V crtl-Mi2dLinux联盟
i2dLinux联盟
i2dLinux联盟
22.如何在“unix命令行”下将一个文件的某字符串用另一个串换掉i2dLinux联盟
i2dLinux联盟
sed 's/string1/string2/gp' file1 > file2i2dLinux联盟
i2dLinux联盟
i2dLinux联盟
23.将/etc/hosts下所有的地址都ping 2次i2dLinux联盟
i2dLinux联盟
1 #/usr/bin/shi2dLinux联盟
2 #grad /etc/hosts and ping each addressi2dLinux联盟
3 cat /etc/hosts|grep -v '^#' | while read LINEi2dLinux联盟
4 doi2dLinux联盟
5 ADDR=`awk '{print $1}'`i2dLinux联盟
6 for MACHINE in $ADDRi2dLinux联盟
7 doi2dLinux联盟
8 ping $MACHINE -n 2i2dLinux联盟
9 donei2dLinux联盟
10 done i2dLinux联盟
原文:http://blog.chinaunix.net/u/29157/showart_244448.html
Linux联盟收集整理 ,转贴请标明原始链接,如有任何疑问欢迎来本站Linux论坛讨论
评论】【加入收藏夹】【 】【打印】【关闭
※ 相关链接
 ·Vi编辑器完全使用手册  (2006-06-14 00:27:37)