vi
来源:互联网 发布:黑屏手机 数据导出 编辑:程序博客网 时间:2024/06/12 01:40
vi是所有Unix及Linux系统下标准的编辑器。
1、vi的基本概念
vi可以分为三种状态:
命令模式(command mode)
插入模式(Insert mode)
底行模式(last line mode)
各模式的功能区分如下:
1) 命令行模式(command mode)
[redhat@localhost ~]$ vi hello.c
这时进入的是命令行模式,控制屏幕光标的移动,字符、字或行的删除,移动复制某区段及进入Insert mode下,或者到 last line mode。
2) 插入模式(Insert mode)
进入命令行模式后,如要编辑按字母 i 即进入插入模式,这样就可以编写程序及文字了。
只有在Insert mode下,才可以做文字输入,按「ESC」键可回到命令行模式。
3) 底行模式(last line mode)
在命令行模式下按 : 即进入底行模式,比如将文件保存或退出vi,也可以设置编辑环境,如寻找字符串、列出行号……等。
:set nu //列出行号
:set nonu //取消行号 。
不过一般我们在使用时把vi简化成两个模式,就是将底行模式(last line mode)也算入命令行模式command mode)。
2、vi的基本操作
a) 进入vi
[redhat@localhost ~]$ vi hello.c
这时是处于命令行模式(command mode),如要编辑就切换到插入模式(Insert mode)才能够输入了。
b) 切换至插入模式(Insert mode)编辑文件
在命令行模式(command mode)下按一下字母 i 就可以进入插入模式(Insert mode),这时就可以开始输入了。
c) Insert 的切换
在处于插入模式(Insert mode)状态下,如一直输入文字发现输错了字,这时想用光标键往回移动,将该字删除,就要先按一下 ESC 键转到命令行模式(command mode)再删除文字。
d) 退出vi及保存文件
在命令行模式(command mode)下,按一下 : 冒号 这时就进入底行模式(Last line mode)
例如:
:w filename (输入 w filename 将文章以指定的文件名filename保存)
:wq (输入 wq 存盘并退出vi)
:q! (输入 q! ,不存盘强制退出vi)
3、命令行模式(command mode)下的功能键
1)插入模式
按 i 切换进入插入模式(insert mode),按 i 进入插入模式后是从光标当前位置开始输入文件;
按 a 进入插入模式后,是从目前光标所在位置的下一个位置开始输入文字;
按 o 进入插入模式后,是插入新的一行,从行首开始输入文字。
2)从插入模式切换为命令行模式
按 ESC 键。
3)移动光标
vi可以直接用键盘上的光标来上下左右移动,但正规的vi是用小写英文字母 k、j、h、l,分别控制光标上、下、左、右 移一格。
按 ctrl+b:屏幕往“后”移动一页,B代表Before
按 ctrl+f:屏幕往“前”移动一页,F代表Forward
按 ctrl+u:屏幕往“后”移动半页,U指Up
按 ctrl+d:屏幕往“前”移动半页,D指Down
注:上面是指按下Ctrl键的同时再按f等键。
按 CRTL+Y : 向上滚动屏幕
按 CRTL+E :向下滚动屏幕
使用z重新定位屏幕命令
z + 回车 // 把当前行移动到屏幕顶部
扩展下上命令如
100z + 回车 // 将移动第100行到屏幕的顶部,记得键入100z之后要再回车
z. // 把当前行移动到屏幕中央,不用回车,切记
z- // 把当前行移动到屏幕底部,同上,不用回车
按搜索移动
事实上,对于一个源程序文件我们往往是要查找其中的一个变量或函数名,最有效的方法就是按文本搜索快速移动。
/pattern // 向前搜索模式,pattern代指要搜索的内容
?pattern // 向后搜索模式
n // 重复上次搜索
N // 反方向重复上次搜索
按行号移动
nG // 移动到第n行,注意此处G是大写
如100G则能快速定位到源程序中第100行代码位置处,想必是很有用的。
Ctrl + g // 显示当前行(并不是移动命令)
G // 移动到文件的尾部
按数字 0 :移到文章的开头。
按 G :移动到文章的最后。
按 g :移动到文章的最开始。
按 Shift+$ :移动到光标所在行的“行尾”。
按 Shift+^ :移动到光标所在行的“行首”
按 w :光标跳到下个字的开头
按 e :光标跳到下个字的字尾
按 b :光标回到上个字的开头
按 #l :光标移到该行的第#个位置,在底行模式下,如:将光标定在第5行, :5l
4)删除文字
x:每按一次,删除光标所在位置的“后面”一个字符。
#x:例如,6x 表示删除光标所在位置的“后面”6个字符。
X:大写的X,每按一次,删除光标所在位置的“前面”一个字符。
#X:例如,20X 表示删除光标所在位置的“前面”20个字符。
dd:删除光标所在行。
#dd:从光标所在行开始删除#行
5)复制
yw:将光标所在之处到字尾的字符复制到缓冲区中。
#yw:复制#个字到缓冲区
yy:复制光标所在行到缓冲区。
#yy:例如,「6yy」表示拷贝从光标所在的该行“往下数”6行文字。
p:将缓冲区内的字符贴到光标所在位置。注意:所有与“y”有关的复制命令都必须与“p”配合才能完成复制与粘贴功能。
6)替换
r:替换光标所在处的字符。
R:替换光标所到之处的字符,直到按下「ESC」键为止。
7)回复上一次操作
u :如果您误执行一个命令,可以马上按下 u ,回到上一个操作。按多次“u”可以执行多次回复。
8)更改
cw:更改光标所在处的字到字尾处
c#w:例如,c3w表示更改3个字
9)跳至指定的行
ctrl+g 列出光标所在行的行号。
#G:例如,15G,表示移动光标至文章的第15行行首。
4、底行模式(Last line mode)下的命令
在使用(last line mode)之前,请记住先按 ESC 键确定您已经处于命令行模式(command mode)下后,再按 : 冒号即可进入底行模式(last line mode)。
A) 列出行号
:set nu :输入set nu 后,会在文件中的每一行前面列出行号。
例如 :set nu //列出行号 或 :set number ;
:set nonu //取消行号 或 :set nonumber ;
:set ai //不自动缩进 或 :set autoindent ;
:set noai //显示Tab及行尾字符 或 :set noautoindent ;
:set list //隐藏Tab及行尾字符
:set nolist //设置Tab宽度为4个字符
:set tabstop=4 //查看当前设置
:set all
B) 跳到文件中的某一行
#:#号表示一个数字,在冒号后输入一个数字,再按回车键就会跳到该行了,如输入数字15,再回车,就会跳到文章的第15行。
C) 查找字符
/关键字:先按 / 键,再输入寻找的字符,然后回车,如果第一次找的关键字不是您想要的,可以一直按 n 会往后寻找到想要的关键字为止。
?关键字:先按 ? 键,再输入寻找的字符,如果第一次找的关键字不是您想要的,可以一直按 n 会往前寻找到您要的关键字为止。
D) 保存文件
w:在冒号输入字母 w 就可以将文件保存起来。
E) 离开vi
q:按 q 就是退出,如果无法离开vi,可以在 q 后跟一个 ! 强制离开vi。如q!
qw:一般建议离开时,搭配 w 一起使用,这样在退出的时候还可以保存文件。
5、vi命令列表
1)下表列出命令模式下的一些键的功能:
h 左移光标一个字符
l 右移光标一个字符
k 光标上移一行
j 光标下移一行
^ 光标移动至行首
0 数字“0”,光标移至文章的开头
G 光标移至文章的最后
$ 光标移动至行尾
Ctrl+f 向前翻屏
Ctrl+b 向后翻屏
Ctrl+d 向前翻半屏
Ctrl+u 向后翻半屏
i 在光标位置前插入字符
a 在光标所在位置的后一个字符开始增加
o 插入新的一行,从行首开始输入
ESC 从输入状态退至命令状态
x 删除光标后面的字符
#x 删除光标后的#个字符
X (大写X),删除光标前面的字符
#X 删除光标前面的#个字符
dd 删除光标所在的行
#dd 删除从光标所在行数的#行
yw 复制光标所在位置的一个字
#yw 复制光标所在位置的#个字
yy 复制光标所在位置的一行
#yy 复制从光标所在行数的#行
p 粘贴
u 取消操作
cw 更改光标所在位置的一个字
#cw 更改光标所在位置的#个字
2)下表列出行命令模式下的一些指令 w filename 储存正在编辑的文件为filename
wq filename 储存正在编辑的文件为filename,并退出vi
q! 放弃所有修改,退出vi
set nu 显示行号
/或? 查找,在/后输入要查找的内容
n 与/或?一起使用,如果查找的内容不是想要找的关键字,按n或向后(与/联用)或向前(与?联用)继续查找,直到找到为止。
用vi时要注意:
1、用vi打开文件后,是处于命令行模式(command mode),要切换到插入模式(Insert mode)才能够输入文字。
切换方法:在命令行模式(command mode)下按一下字母 i 就可以进入插入模式(Insert mode),这时就可以开始输入文字了。
2、编辑好后,需从插入模式切换为命令行模式才能对文件进行保存,切换方法:按「ESC」键。
3、保存并退出文件:在命令模式下输入:wq即可!(别忘了wq前面的:)
----------------------------------vi高级命令----------------------------------
vi高级命令:
xp :交换两个字符位置
ddp :上下两行调换
:g/^/m0/ :把文件内容反转。(底行模式)
J 上下两行合并
dG : 删除所有行
d$ :从当前位置删除到行尾
y$ 如果要粘贴到其他地方 p 就可以了 :从当前位置复制到行尾 由于vi 是建立在 EX 上的 所以 当键入 : 时就来到了 EX 命令状态
:ab string strings :例如::ab usa 回车时看到:ab usa United States of America 就蹦出来了
nny :表示拷贝从光标行起的下 n 行内容,p 表示paste,可刚复制的内容粘贴在光标处的下面。
r :单个字符替换
R :覆盖多个字符
s :用多个字符替换一个字符
S :整行替换
k :上移
#k :上移#行
j :下移
#j :下移# 行
在当前屏幕中:
H 跳到第一行
M 跳到中间一行
L 跳到最后一行
删除命令操作
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表示对每一个s2都用s3替换包括s1的行都进行替换,第二个 g 表示对每一行包括s1的行所有的 s 表示替换,s2是要被替换的字符串替换字符串,他可以和s1相同(如果相同的话用//代替),s3是16.
fx 往右移动到 x 字符上
Fx 往左移动到 x 字符上
tx 往右移动到 x 字符前
Tx 往左移动到 x 字符后
(注意:以上四个命令中,其中x是键入的字符)
;
分号,配合 f 和 t 使用,重复一次
,
逗号,配合 f 和 t 使用,反方向重复一次
如何在“unix命令行”下将一个文件的某字符串用另一个串换掉
sed 's/string1/string2/gp' file1 > file2
将/etc/hosts下所有的地址都ping 2次
1 #/usr/bin/sh
2 #grad /etc/hos
ts and ping each address
3 cat /etc/hosts|grep -v '^#
' | while read LINE
4 do
5 ADDR=`awk '{print $1}'`
6 for MACHINE in $ADDR
7 do
8 ping $MACHINE -n 2
9 done
10 done
附图vi_vim:
http://hi.csdn.net/space-10159623-do-album-picid-998234.html
--------------------------------------------Practice makes perfect!----------------------------------------