vi9

Vim正则表达式详解



[日期:2012-11-29]

来源:Linux社区  作者:salc3k

[字体:大 中 小] 







一 VI中如何使用正则表达式
 
使用正则表达式的命令最常见的就是/ (搜索)命令。其格式如下:
 
/正则表达式
 
另一个很有用的命令就是 :s(替换)命令,将第一个//之间的正则表达式替换成第二个//之间的字符串。
 
:s/正则表达式/替换字符串/选项
 
二、元字符
 
元字符是具有特殊意义的字符。使用元字符可以表达任意字符、行首、行 尾、某几个字符等意义。
 
元字符一览
 



元字符
 
说明
 



.
 
匹配任意一个非空字符,不包括换行符
 


[abc]
 
匹配方括号中的任意一个字符。可以使用-表示字符范围,
如[a-z0-9]匹 配小写字母和阿拉伯数字。
 


[^abc]
 
在方括号内开头使用^符号,表示匹配除方括号中字符之外的任意字符。
 


\d
 
匹配阿拉伯数字,等同于[0-9]。
 


\D
 
匹配阿拉伯数字之外的任意字符,等同于[^0-9]。
 


\x
 
匹配十六进制数字,等同于[0-9A-Fa-f]。
 


\X
 
匹配十六进制数字之外的任意字符,等同于[^0-9A-Fa-f]。
 


\w
 
匹配单词字母,等同于[0-9A-Za-z_]。
 


\W
 
匹配单词字母之外的任意字符,等同于[^0-9A-Za-z_]。
 


\t
 
匹配<TAB>字符。
 


\s
 
匹配空白字符,等同于[ \t],即空格和Tab
 


\S
 
匹配非空白字符,等同于[^ \t]。
 

另外,如果要查找字符 *、.、/等,则需要在前面用 \ 符号,表示这不是元字符,而只是普通字符而已。
 



元字符
 
说明
 



\*
 
匹配 * 字符。
 


\.
 
匹配 . 字符。
 


\/
 
匹配 / 字符。
 


\\
 
匹配 \ 字符。
 


\[
 
匹配 [ 字符。
 

量词
 



元字符
 
说明
 



*
 
匹配0-任意个
 


\+
 
匹配1-任意个
 


\?
 
匹配0-1个
 


\{n,m}
 
匹配n-m个
 


\{n}
 
匹配n个
 


\{n,}
 
匹配n-任意个
 


\{,m}
 
匹配0-m个
 



表示位置的符号
 



元字符
 
说明
 



$
 
匹配行尾
 


^
 
匹配行首
 


\<
 
匹配单词词首
 


\>
 
匹配单词词尾
 

 
 
例子:
 
/char\s\+[A-Za-z_]\w*; " 查找所有以char开头,之后是一个以上的空白," 最后是一个标识符和分号
 
/\d\d:\d\d:\d\d " 查找如 17:37:01 格式的时间字符串
 
:g/^\s*$/d " 删除只有空白的行
 
:s/\<four\>/4/g " 将所有的four替换成4,但是fourteen中的four不替换

本篇文章来源于 Linux公社网站(www.linuxidc.com)  原文链接:http://www.linuxidc.com/Linux/2012-11/75113.htm

  

三、替换变量
 
在正规表达式中使用 \( 和 \) 符号括起正规表达式,即可在后面使用\1、\2 等变量来访问 \( 和 \) 中的内容。
 
使用例
 
/\(a\+\)[^a]\+\1 //查找开头和结尾处a的个数相同的字符串," 如 aabbbaa,aaacccaaa,但是不匹配 abbbaa
 
:s/\(http:\/\/[-a-z\._~\+%\/]\+\)/<a href="\1">\1<\/a>/ // 将URL替换为<a href="http://url">http://url</a>的格式
 
:s/\(\w\+\)\s\+\(\w\+\)/\2\t\1 //将 data1 data2 修改为 data2 data1
 
四、函数式
 
在替换命令 s/// 中可以使用函数表达式来书写替换内容,格式为
 
:s/替换字符串/\=函数式
 
在函数式中可以使用 submatch(1)、submatch(2) 等来引用 \1、\2 等的内容,而submatch(0)可以引用匹配的整个内容。
 
使用例
 
:%s/\<id\>/\=line(".") " 将各行的 id 字符串替换为行号
 
:%s/^\<\w\+\>/\=(line(".")-10) .".". submatch(1) " 将每行开头的单词替换为 (行号-10).单词 的格式, 如第11行的 word 替换成 1. word
 
五、与Perl正则表达式的区别
 
元字符的区别
 


Vim语法
 
Perl语法
 
含义
 



\+
 
+
 
1-任意个
 


\?
 
?
 
0-1个
 


\{n,m}
 
{n,m}
 
n-m个
 


\(和\)
 
(和)
 
分组
 

 
 
 
 
六、常用vi 正则表达式
 
:%s/^/Head content/g "全局插入开头信息
 :%s/$/Tail content/g "全局插入尾部信息 
:%s= *$== "将所有行尾多余的空格删除
 :g/^\s*$/d "将所有不包含字符(空格也不包含)的空行删除.
 
:%s/ */ /g 把一个或者多个空格替换为一个空格。
 
:%s/ *$// 去掉行尾的所有空格。
 
:%s/^/ / 在每一行头上加入一个空格。
 
:%s/^[0-9][0-9]* // 去掉行首的所有数字字符。
 
:%s/b[aeio]g/bug/g 将所有的bag、beg、big和bog改为bug。
 
:%s/t([aou])g/h1t/g 将所有tag、tog和tug分别改为hat、hot和hug(注意用group的用法和使用1引用前面被匹配的字符)。

本篇文章来源于 Linux公社网站(www.linuxidc.com)  原文链接:http://www.linuxidc.com/Linux/2012-11/75113p2.htm

  

七、关于magic
 
 
 
vim中有个magic的设定。设定方法为:
 :set magic             " 设置magic
:set nomagic           " 取消magic
:h magic               " 查看帮助 
简单地说, magic就是设置哪些元字符要加反斜杠哪些不用加的。 简单来说:
 ■magic(\m):除了 $ . * ^ 之外其他元字符都要加反斜杠。
 ■nomagic(\M):除了 $ ^ 之外其他元字符都要加反斜杠。
 
这个设置也可以在正则表达式中通过 \m \M 开关临时切换。 \m 后面的正则表达式会按照 magic 处理,\M 后面的正则表达式按照 nomagic 处理, 而忽略实际的magic设置。
 
例如:
 /\m.*          # 查找任意字符串
/\M.*          # 查找字符串 .* (点号后面跟个星号)
   
另外还有更强大的 \v 和 \V。 * \v(即 very magic 之意):任何元字符都不用加反斜杠 * \V(即 very nomagic 之意):任何元字符都必须加反斜杠
 
例如:
 /\v(a.c){3}$   # 查找行尾的abcaccadc
/\m(a.c){3}$   # 查找行尾的(abc){3}
/\M(a.c){3}$   # 查找行尾的(a.c){3}
/\V(a.c){3}$   # 查找任意位置的(a.c){3}$ 
默认设置是 magic,vim也推荐大家都使用magic的设置,在有特殊需要时,直接通过 \v\m\M\V 即可。
 
vim的帮助文件非常有用,关于正则表达式可以参考以下的内容。
 :h pattern
:h magic
:h perl-patterns
本篇文章来源于 Linux公社网站(www.linuxidc.com)  原文链接:http://www.linuxidc.com/Linux/2012-11/75113p3.htm

  

文档操作
vi/vim 基本使用方法 
本文介绍了vi (vim)的基本使用方法,但对于普通用户来说基本上够了!
 
vi编辑器是所有Unix及Linux系统下标准的编辑器,它的强大不逊色于任何最新的文本编辑器,这里只是简单地介绍一下它的用法和一小部分指令。由于对Unix及Linux系统的任何版本,vi编辑器是完全相同的,因此您可以在其他任何介绍vi的地方进一步了解它。Vi也是Linux中最基本的文本编辑器,学会它后,您将在Linux的世界里畅行无阻。
 
1、vi的基本概念
  基本上vi可以分为三种状态,分别是命令模式(command mode)、插入模式(Insert mode)和底行模式(last line mode),各模式的功能区分如下:
 
1) 命令行模式command mode)
 
  控制屏幕光标的移动,字符、字或行的删除,移动复制某区段及进入Insert mode下,或者到 last line mode。
 
2) 插入模式(Insert mode)
 
  只有在Insert mode下,才可以做文字输入,按「ESC」键可回到命令行模式。
 
3) 底行模式(last line mode)
 
  将文件保存或退出vi,也可以设置编辑环境,如寻找字符串、列出行号……等。
 
不过一般我们在使用时把vi简化成两个模式,就是将底行模式(last line mode)也算入命令行模式command mode)。
 
2、vi的基本操作
a) 进入vi
 
  在系统提示符号输入vi及文件名称后,就进入vi全屏幕编辑画面:
 
   $ vi myfile
 

  不过有一点要特别注意,就是您进入vi之后,是处于「命令行模式(command mode)」,您要切换到「插入模式(Insert mode)」才能够输入文字。初次使用vi的人都会想先用上下左右键移动光标,结果电脑一直哔哔叫,把自己气个半死,所以进入vi后,先不要乱动,转换到「插入模式(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是用小写英文字母「h」、「j」、「k」、「l」,分别控制光标左、下、上、右移一格。
 
  按「ctrl」+「b」:屏幕往“后”移动一页。
 
  按「ctrl」+「f」:屏幕往“前”移动一页。
 
  按「ctrl」+「u」:屏幕往“后”移动半页。
 
  按「ctrl」+「d」:屏幕往“前”移动半页。
 
  按数字「0」:移到文章的开头。
 
  按「G」:移动到文章的最后。
 
  按「$」:移动到光标所在行的“行尾”。
 
  按「^」:移动到光标所在行的“行首”
 
  按「w」:光标跳到下个字的开头
 
  按「e」:光标跳到下个字的字尾
 
  按「b」:光标回到上个字的开头
 
  按「#l」:光标移到该行的第#个位置,如:5l,56l。
 
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」后,会在文件中的每一行前面列出行号。
 
B) 跳到文件中的某一行
 
 「#」:「#」号表示一个数字,在冒号后输入一个数字,再按回车键就会跳到该行了,如输入数字15,再回车,就会跳到文章的第15行。
 
C) 查找字符
 
 「/关键字」:先按「/」键,再输入您想寻找的字符,如果第一次找的关键字不是您想要的,可以一直按「n」会往后寻找到您要的关键字为止。
 
 「?关键字」:先按「?」键,再输入您想寻找的字符,如果第一次找的关键字不是您想要的,可以一直按「n」会往前寻找到您要的关键字为止。
 
D) 保存文件
 
 「w」:在冒号输入字母「w」就可以将文件保存起来。

E) 离开vi
 
 「q」:按「q」就是退出,如果无法离开vi,可以在「q」后跟一个「!」强制离开vi。
 
 「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

本篇文章来源于 Linux公社网站(www.linuxidc.com)  原文链接:http://www.linuxidc.com/Linux/2007-10/8686.htm

 


 

  • 博客访问: 61988
  • 博文数量: 116
  • 博客积分: 3486
  • 博客等级: 中校
  • 技术积分: 1165
  • 用  户  组:  普通用户
  • 注册时间: 2009-07-21 10:59
 
文章分类

全部博文(116)

  • 一种生活(27)                               
  • 第五象限(7)                               
  • 有意思吧(43)                               
  • 工作记录(38)                               
  • 未分配的博文(1)                               
文章存档

2011年(23)

2009年(93)

我的朋友
最近访客
订阅
友情链接
Vi/Vim的使用2009-07-26 10:05:33

分类: 系统运维

 

10.2 vi的使用

通常,vi共分为3种模式,分别是“一般模式”、“编辑模式”与“命令行命令模式”。这3种模式的作用如下。

·   一般模式:vi处理文件时,一进入该文件,就是一般模式了。在这个模式中,可以使用“上下左右”键来移动光标,可以使用“删除字符”或“删除整行”来处理文件内容,也可以使用“复制、粘贴”来处理文件数据。

·   编辑模式:在一般模式中可以进行删除、复制、粘贴等操作,却无法进行编辑操作。要等到按下“i、I、o、O、a、A、r、R”等字母之后才会进入编辑模式。注意,通常在Linux中,按下上述字母时,画面的左下方会出现“INSERT或REPLACE”的字样,才可以输入任何字到文件中。如果要回到一般模式时,则必须要按下Esc键才可退出编辑模式。

·   命令行命令模式:在一般模式中,输入“: 或 / 或 ?”就可以将光标移到最下面的那一行,在这个模式中,您可以搜索数据,而且读取、存盘、大量删除字符、离开vi、显示行号等操作都是在此模式中实现的。

简而言之,我们可以将这3种模式用图来表示。

 

下面以一个简单的例子来进行说明。

10.2.1  简单执行范例

怎么使用vi建立一个文件名为test.txt的文件呢?很简单,步骤如下。

1. 使用vi进入一般模式

[root@linux ~]# vi test.txt

直接输入“vi文件名”即可进入vi。如图10-2所示,左下角会显示这个文件的当前状态。如果是新建文件,会显示 [New File],如果是已存在的文件,则会显示当前文件名、行数与字符数,例如:“"/etc/man.config" 145L, 4614C”。

2. 按下i进入编辑模式,开始编辑文字

在一般模式中,只要按下I、o、a等字符,就可以进入编辑模式了。在编辑模式中,可以发现在左下角会出现 --INSERT-- ,意味着可以输入任意字符,如图10-3所示。这个时候,键盘上除了 [Esc] 这个按键之外,其他按键都可以视作为一般的输入按钮,可以进行任何编辑(在vi里,[Tab]键所得到的结果与空格符所得到的不一样,特别强调一下)。

3. 按下 [Esc] 键回到一般模式

假设已经按照上面的样式编辑完毕,那么,应该如何退出?就是按下 [Esc] 键。马上就会发现画面左下角的 --INSERT-- 不见了。

4. 在一般模式中按下 :wq存储后离开vi

我们要保存文件了,存盘并离开的命令很简单,输入“:wq”即可保存文件并离开(注意,按下 : ,该光标就会移到最下面的一行)。这时在提示符后面输入“ls -l”即可看到刚建立的test.txt文件。

如此一来,文件test.txt已经建立好了,很简单。需要注意的是,如果文件权限不对,例如为 -r--r--r-- 时,那么可能会无法写入。可以使用“强制写入”的方式吗?可以。使用“:wq!”多加一个感叹号即可。不过,需要特别注意,这是在“你的权限可以改变”的情况下可行的。关于权限的概念,请参考第6章的内容。

10.2.2  命令行内容说明

如前所述,命令行或命令模式,就是在最下面一行中没有显示--INSERT--或者--REPLACE--字样。通常,命令行中的命令参见表10-1(注意,当按下“:”时,光标会自动移到屏幕的最下面一行)。

表10-1                              命令行的命令

一般模式:移动光标的方法

h或向左方向键(←)

光标向左移动一个字符

j或向下方向键(↓)

光标向下移动一个字符

k或向上方向键(↑)

光标向上移动一个字符

                                         续表      

一般模式:移动光标的方法

l或向右方向键(→)

光标向右移动一个字符

如果想要进行多次移动的话,例如向下移动30行,可以使用“30j”或“30↓”的组合键,即加上想要进行的次数(数字)后,操作即可

[Ctrl] + [f]

屏幕“向下”移动一页,相当于 [Page Down] 按键(常用)

[Ctrl] + [b]

屏幕“向上”移动一页,相当于 [Page Up] 按键(常用)

[Ctrl] + [d]

屏幕“向下”移动半页

[Ctrl] + [u]

屏幕“向上”移动半页

一般模式:移动光标的方法

+

光标移动到非空格符的下一行

-

光标移动到非空格符的上一行

n <space>

n表示“数字”,例如20。按下数字后再按空格键,光标会向右移动这一行的n个字符。例如20 <space> 则光标会向后面移动20个字符距离

0

这是数字“0”:移动到这一行的最前面字符处(常用)

$

移动到这一行的最后面字符处(常用)

H

光标移动到这个屏幕的最上方那一行

M

光标移动到这个屏幕的中央那一行

L

光标移动到这个屏幕的最下方那一行

G

移动到这个文件的最后一行(常用)

nG

n为数字。移动到这个文件的第n行。例如20G则会移动到这个文件的第20行(可配合 :set nu)

gg

移动到这个文件的第一行,相当于1G(常用)

n <Enter>

n为数字。光标向下移动n行(常用)

一般模式:搜索与替换

/word

从光标位置开始,向下寻找一个名为word的字符串。例如要在文件内搜索vbird这个字符串,就输入 /vbird即可(常用)

?word

从光标位置开始,向上寻找一个名为word的字符串

n

n是英文按键。表示“重复前一个搜索的动作”。举例来说,如果刚刚执行 /vbird去向下搜索vbird字符串,则按下n后,会向下继续搜索下一个名称为vbird的字符串。如果是执行 ?vbird的话,那么按下n,则会向上继续搜索名称为vbird的字符串

N

这个N是英文按键。与n刚好相反,为“反向”进行前一个搜索操作。例如 /vbird后,按下N则表示“向上”搜索vbird

                                        

                                         续表      

一般模式:搜索与替换

:n1、n2s/word1/word2/g

n1与n2为数字。在第n1与n2行之间寻找word1这个字符串,并将该字符串替换为word2。举例来说,在100到200行之间搜索vbird并替换为VBIRD则:“:100、200s/vbird/VBIRD /g”(常用)

:1、$s/word1/word2/g

从第一行到最后一行寻找word1字符串,并将该字符串替换为word2(常用)

:1、$s/word1/word2/gc

从第一行到最后一行寻找word1字符串,并将该字符串替换为word2。且在替换前显示提示符给用户确认(conform)是否需要替换(常用)

一般模式:删除、复制与粘贴

x, X

在一行字中,x为向后删除一个字符(相当于 [Del] 按键),X为向前删除一个字符(相当于 [backspace] 即退格键)(常用)

nx

n为数字,连续向后删除n个字符。举例来说,要连续删除10个字符,则输入“10x”

dd

删除光标所在的那一整行(常用)

ndd

n为数字。从光标位置开始,删除向下n列,例如20dd则是删除20列(常用)

d1G

删除光标所在位置到第一行的所有数据

dG

删除光标所在位置到最后一行的所有数据

d$

删除光标所在位置到该行的最后一个字符

d0

d的后面是数字0,删除光标所在处,到该行的最前面一个字符

yy

复制光标所在的那一行(常用)

nyy

n为数字。复制光标所在的向下n行,例如20yy则是复制20行(常用)

y1G

复制光标所在行到第一行的所有数据

yG

复制光标所在行到最后一行的所有数据

y0

复制光标所在的那个字符到该行行首的所有数据

y$

复制光标所在的那个字符到该行行尾的所有数据

一般模式:删除、复制与粘贴

p, P

p为将已复制的数据粘贴到光标的下一行,P则为贴在光标上一行。举例来说,当前光标在第20行,且已经复制了10行数据。则按下p后,那10行数据会贴在原来的20行之后,即由21行开始贴。但如果是按下P,那么原来的第20行会被变成30行(常用)

J

将光标所在行与下一列的数据结合成同一行

c

重复删除多个数据,例如向下删除10行,[10cj]

u

复原前一个操作(常用)

[Ctrl]+r

重做上一个操作(常用)

u与 [Ctrl]+r是很常用的命令。一个是复原,另一个则是重做一次。利用这两个功能按键,编辑起来就得心应手。

                                         续表      

一般模式:删除、复制与粘贴

.

这就是小数点。意思是重复前一个动作。如果想重复删除、重复粘贴,按下小数点“.”就可以(常用)

进入编辑模式

i、I

插入:在当前光标所在处插入输入文字,已存在的文字会向后退;其中,i为“从当前光标所在处插入”,I为“在当前所在行的第一个非空格符处开始插入”(常用)

a、A

a为“从当前光标所在的下一个字符处开始插入”,A为“从光标所在行的最后一个字符处开始插入”(常用)

o、O

这是英文字母o的大小写。o为“在当前光标所在的下一行处插入新的一行”;O为“在当前光标所在处的上一行插入新的一行”(常用)

r、R

替换:r会替换光标所在的那一个字符;R会一直替换光标所在的文字,直到按下ESC键为止(常用)

使用上面这些按键时,在vi画面的左下角处会出现“--INSERT--”或“--REPLACE--”的字样。通过名称就知道是什么操作。特别注意,上面也提过了,想在文件中输入字符时,一定要在左下角处看到INSERT/REPLACE才能输入。

Esc

退出编辑模式,回到一般模式中(常用)

命令行命令模式

:w

将编辑的数据写入硬盘文件中(常用)

:w!

若文件属性为“只读”时,强制写入该文件。不过,到底能不能写入,与文件权限有关

:q

离开vi(常用)

:q!

若曾修改过文件,又不想存储,使用 ! 为强制离开不存储文件

注意一下,那个感叹号(!)在vi当中,常常具有“强制”的意思。

:wq

存储后离开,若为 :wq! 则为强制存储后离开(常用)

:e!

将文件还原到最原始的状态

ZZ

若文件没有更改,则不存储离开,若文件已经更改,则存储后离开

:w [filename]

将编辑的数据存储成另一个文件(类似另存新文件)

:r [filename]

在编辑的数据中,读入另一个文件的数据。即将“filename”这个文件内容加到光标所在行的后面

:n1、n2 w [filename]

n1到n2的内容存储成filename文件

:! command

暂时离开vi到命令行模式下执行command的显示结果。例如“:! ls /home”,即可在vi中查看 /home中以ls输出的文件信息

:set nu

显示行号,设置之后,会在每一行的前缀显示该行的行号

:set nonu

与set nu相反,为取消行号

特别注意,在vi中,“数字”是很有意义的。数字通常表示重复做几次的意思。也有可能表示要去哪里的意思。举例来说,要删除50行,则是用“50dd”。数字加在动作之前。要向下移动20行,使用“20j”或者“20↓”即可。

掌握这些命令就很不错了,因为常用到的命令也可能只有一半。通常vi的命令除了上面笔者注明的常用的几个外,其他不用背,可以做一张简单的命令表,当有问题时就可以马上查询。

10.2.3  案例练习

现在测试一下,你是否已经熟悉了vi命令。请按照需求进行命令操作(下面的操作使用FC4的默认文件来进行练习。可以在这里下载:http://linux.vbird.org/linux_basic/0310vi/man.config)。

看看你的显示结果与笔者的结果是否相同。

1. 请在 /tmp目录下建立一个名为vitest的目录。

2. 进入vitest目录中。

3. 将 /etc/man.config复制到本目录中(或由上述的连接下载man.config文件)。

4. 使用vi打开本目录下的man.config文件。

5. 在vi中设置行号。

6. 移动到第58行,向右移动40个字符,请问您双引号内是什么目录?

7. 移动到第一行,并且向下搜索“bzip2”字符串,请问它在第几行?

8. 接下来,要将50~100行之间的man改为MAN,并且一个一个挑选是否需要修改,如何执行命令?

9. 修改完之后,突然反悔了,要全部复原,有哪些方法?

10. 要复制51~60行的内容,并且贴到最后一行之后。

11. 删除11~30行之间的20行。

12. 将这个文件另存成一个man.test.config文件。

13. 到第29行,并且删除15个字符。

14. 存储后离开。

整个步骤可以如下显示:

1. "mkdir /tmp/vitest"

2. "cd /tmp/vitest"

3. "cp /etc/man.config ."

4. "vi man.config"

5. ":set nu"

6. 先按下“58G”,再按下“40→”会在双引号内看到“/dir/bin/foo”。

7. 先执行“1G”或“gg”后,直接输入“/bzip2”,则会到第116行。

8. 直接执行“:50,100s/man/MAN/gc”即可。

9. 简单的方法可以一直按“u”恢复到原始状态,或者使用不存储离开的方式“:q!”之后,再重新读取一次该文件。

10. “51G”,然后再“10yy”之后,按下“G”到最后一行,再用“p”粘贴10行。

11. “11G”之后,再用“20dd”即可删除20行。

12. :w man.test.config。

13. “29G”之后,再用“15x”即可删除15个字符。

14. “:wq!”。

如果可以查到结果,那么您基本上就掌握了vi的使用了。

10.2.4  文件的恢复与暂存盘

vi具有“可恢复”的功能。vi凭借什么进行恢复呢?很简单,临时文件。举例来说,当我们编辑一个文件时,假设名称为 /tmp/ passwd,那么在这个 /tmp中就会有一个临时文件,文件名为“/tmp/.passwd.swp”,这是一个隐藏文件,我们所进行的一些修改,都会暂时存在该文件中。如果在文件修改过程中,系统死机,那么下次再重新vi /tmp/passwd时,系统就会告诉你,是否需要恢复(recovery)成修改过程中的模样?如果按下 (R),就可以将数据恢复到修改过程的样子,而不是源文件。这是个很有用的功能。

也就是说,如果有一天,在 /tmp中执行ls -al时,发现有两个文件,文件名分别为passwd与 .passwd.swp,那么,(1) 可能有人在编辑这个文件;(2) 之前你在编辑这个文件时,因为某些未知因素导致vi程序中断,则该临时文件就会存在。如果是状态 (2),则此时可以将该 .passwd.swp文件删除,或者直接vi /tmp/passwd,在vi询问是否恢复时,选择恢复,然后存储更新 /tmp/passwd,之后再将这个 /tmp/.passwd.swp文件删除即可。如果不删除的话,那么每次编辑这个文件时,都会告诉你该文件有问题。

10.3 vim的附加功能

其实,当前大部分的版本都以采用vim替代vi的功能了。如果使用vi后,却看到画面右下角有显示当前光标所在的行号,那么,就说明你的vi已经被vim所替换。为什么要用vim呢?因为vim具有颜色显示功能,并且还支持许多程序语法(syntax),因此,当使用vim编辑程序时(不论是C语言,还是shell脚本),vim可帮你直接进行“程序调试(debug)”。

如果在文字模式下,输入alias时,出现这样的画面:

[root@linux ~]# alias

alias vi='vim'

这表示使用vi这个命令时,其实就是执行vim。如果没有这一行,那么就必须要使用vim文件名来启动vim。vim的一般用法与vi完全一样,没有不同。下面我们来看看vim的画面是什么样的。假设要编辑 /etc/man.config,则输入“vim /etc/man.config”。

#

# Generated automatically from man.conf.in by the

# configure script.

#

# man.conf from man-1.5p

#

# For more information about this file, see the man pages man(1)

# and man.conf(5).

"man.config" 138L, 4506C                               1,1          Top

这是vim画面的一部分,它有几个特点:

·   最下面一行说明这个文件的特点,包括138行,共4506字符。

·   1,1表示当前光标在第一行的第一个字符上。可以看到第一行有个光标。

·   Top表示,这个画面是整个文件的最上方。

至少应该就有这些信息。在移动光标时,1,1的光标定位也会跟着变动,很方便。下面我们就来介绍其他vim的用法。

10.3.1  块选择(Visual Block)

刚刚提到的简单的vi操作过程中,几乎都是以行为单位操作。那么,如果想要解决一个块范围的问题呢?举例来说,像下面这种格式的文件:

192.168.1.1    host1.class.net

192.168.1.2    host2.class.net

192.168.1.3    host3.class.net

192.168.1.4    host4.class.net

.....中间省略......

我将这个文件放到http://linux.vbird.org/linux_basic/0310vi/hosts中,你可以下载来看一看。如果想复制前面的IP地址部分,后面的主机名称部分不复制,怎么办?这个时候就需要使用块选择(Visual Block)的功能。当按下v键或者V键或者 [Ctrl]+v键时,光标移动过的地方就会开始反白,这3个按键的意义参见表10-2。

表10-2                             块选择的按键意义

按键

块选择的按键意义

v

字符选择,会将光标经过的地方反白选择

V

行选择,会将光标经过的行反白选择

[Ctrl]+v

块选择,可以用长方形的方式选择数据

y

复制反白的地方

d

将反白的地方删除掉

 

我们以上面的IP地址对应主机名称为例,如果想复制IP地址的话,而且仅想要前4行,那么可以按如下方式进行:

·   将光标移到第一行的第一个字符(1G)。

·   按下 [Ctrl]+v键(按着 [ctrl]键 不放,再按下v键)。

·   移动方向键,向下向右移动数格,让整个反白区域覆盖191.168.1.1到192.168.1.4。

·   按下y复制(此时反白会自动不见)。

·   移动到任何想要插入的区域,按下p就可以插入刚刚复制的块内容。举例来说,移动到第1行的第13个字符处按下小写的p,看看会怎样?

这个块选择在格式整齐的文件中,就会很有用。尤其是我们想要大量复制其中一个块,而不是整行复制的场合中,会非常有用。

10.3.2  多文件编辑

假设要将hosts内的IP地址复制到 /etc/hosts文件,该如何编辑呢?我们知道,在vi内可以使用 :r filename来读入某个文件的内容,不过,这样毕竟是将整个文件读入。如果只是想将部分内容读入时,多文件同时编辑就很有用了。我们可以选择将vim后面接多个文件来同时打开它们。相关的按键参见表10-3。

表10-3                          多文件编辑的按键

按键

意义

:n

编辑下一个文件

:N

编辑上一个文件

:files

列出当前vim打开的所有文件

 

这个功能也很不错。现在可以做一下练习。假设要将刚才笔者提供的hosts内的IP地址复制到 /etc/hosts文件内,可以这样做:

[root@linux ~]# vi hosts /etc/hosts

# 在这个文件中利用上一小节提到的块选择,按下 [ctrl]+v键来进行块选择,并复制。

# 然后按下 :n在命令行的地方输入这些,就会转到下一个文件,这个时候,

# 就可以按下p,将刚刚复制的IP地址贴到文件中。如果按下 :files,则:

---------------------------------------------------------------------------

192.168.1.4    host4.class.net

192.168.1.5    host5.class.net

~

~

:files

  1 %a   "hosts"                        line 1

  2 #    "/etc/hosts"                   line 1

Hit ENTER or type command to continue

---------------------------------------------------------------------------

# 看到了吗?在命令行输入 :files就可以显示当前所编辑的文件信息。

由此可知,利用多文件编辑的功能,可以很快速地将需要的数据复制到正确的文件。当然,这个功能也可以利用窗口界面来实现。

10.3.3  多窗口功能

想象两个情况:

·   有一个文件非常大,查看到后面的数据时,想要“对照”看前面的数据,是否需要使用 [Ctrl]+f与 [Ctrl]+b键来前后地查看?

·   有两个需要对照着看的文件,不想使用前一小节提到的多文件编辑功能。

这样的情况下,可以使用vim打开两个窗口。在命令行模式下输入:“:sp {filename}”,filename可有可无,如果想在新窗口启动另一个文件,就加入文件名,否则仅输入 :sp,在两个窗口间会出现同一个文件。例如笔者使用vim hosts后,再使用 :sp /etc/hosts,会出现如下内容:

# Do not remove the following line, or various programs

# that require network functionality will fail.

127.0.0.1       localhost.localdomain localhost

192.168.1.11    vbird-work

192.168.1.2     vbird-server

~

/etc/hosts                   5,1            All

192.168.1.1    host1.class.net

192.168.1.2    host2.class.net

192.168.1.3    host3.class.net

192.168.1.4    host4.class.net

192.168.1.5    host5.class.net

hosts                        1,1            Top

两个文件同时在一个屏幕上显示。您还可以利用“[Ctrl]+w+j”键及“[Ctrl]+w+k”键在两个窗口之间切换,这样,复制、查看等操作就变得很简单。命令的功能有很多,您只要记住表10-4给出的这些即可。

表10-4                        多窗口情况下的按键功能

按键

功能

:sp [filename]

打开一个新窗口,如果加filename,表示在新窗口打开一个新文件,否则表示两个窗口为同一个文件内容(同步显示)

[Ctrl]+wj

按键的按法是:先按下 [Ctrl] 不放,再按下w后放开所有的按键,然后再按下j,则光标可移到下方的窗口

[Ctrl]+wk

同上,不过光标移动到上面的窗口

[Ctrl]+wq

其实就是 :q结束离开。举例来说,如果想结束下方的窗口,利用 [Ctrl]+wj键移到下方窗口后,按下 :q即可离开,也可以按下 [Ctrl]+wq键

 

10.3.4  vim环境设置

如果以vim软件来搜索一个文件内部的某个字符串时,这个字符串会被反白,而下次再次以vim编辑这个文件时,该搜索的字符串还是存在。当编辑其他文件时,如果其他文件中也存在这个字符串,也会主动反白显示。另外,当重复编辑同一个文件时,第二次进入该文件,光标竟然就在上次离开的那一行上,非常方便。但是,怎么会这样呢?

这是因为vim会主动将曾经做过的行为记录下来,以便下次可以轻松工作。那个记录动作的文件就是:~/.viminfo。每个人的家目录都应该有这个文件。这个文件是自动产生的,不必自行建立。在vim里所做过的操作,可以在这个文件内部查询到。

由于在某些版本的vim中,利用搜索时,它并不会反白显示,这些版本则会主动地帮你进行缩排(就是当按下Enter键编辑新行时,光标不会在行首,而是在与上一行的第一个非空格符处对齐)。其实这些都可以进行设置,即进行vim的环境设置。vim的环境设置参数有很多,如果想知道当前设置值,可以在一般模式时输入:“:set all”来查看,不过,设置项目实在太多了。所以,笔者在表10-5中,列出一些平时比较常用的简单的设置值,以供参考。

表10-5                          vim的环境设置参数

参数

说明

:set nu

设置行号。取消的话,就是 :set nonu

:set hlsearch

设置是否将搜索的字符串反白。默认值是hlsearch,如果不想反白,就用 :set nohlsearch

:set autoindent

是否自动缩排。autoindent是自动缩排,不想缩排就用 :set noautoindent

:set backup

是否自动存储备份文件。一般用nobackup,如果设置backup,当你更改任何一个文件时,则源文件会被另存为一个名为filename~的文件。举例来说,我们编辑hosts,设置 :set backup,那么当更改hosts时,在同一目录下,就会产生hosts~ 文件名的文件,记录原始的hosts文件内容

:set ruler

设置是否在右下角显示状态行说明

:set showmode

是否在左下角的状态行显示 --INSERT--

:set backspace=(012)

一般来说,如果按下i进入编辑模式后,可以利用退格键(backspace)来删除任意字符。但是,某些版本则不许这样做。此时,就可以通过backspace来设置。当backspace为2时,可以删除任意值;0或1时,仅可删除刚刚输入的字符,而无法删除原来就已经存在的文字

:set all

显示当前所有的环境参数设置值

:syntax (off|on)

是否根据程序相关语法显示不同的颜色。举例来说,在编辑一个纯文本文件时,如果是以 # 开始,那么该行就会变成蓝色。如果你懂得写程序,那么这个 :syntax on还会主动帮你调试。但是,如果仅是编写纯文本文件,要避免颜色对屏幕产生的干扰,则可以取消这个设置 :syntax off

 

总之,这些设置值很有用。但是,是否每次使用vim都要重新设置一次各个参数值呢?没有必要。我们可以通过设置文件来直接规定习惯的vim操作环境。vim设置值一般是放在 /etc/vimrc文件中,不过,建议不要修改它。可以修改 ~/.vimrc文件(默认不存在,请自行手动建立),写入所希望的设置值。举例来说,可以是这样的一个文件:

[root@linux ~]# vi ~/.vimrc

:set hlsearch

:set backspace=2

:set autoindent

:set rulet

:set showmode

:syntax on

这样,当下次重新以vim编辑某个文件时,该文件的默认环境设置就是上面那样的,这样可以方便操作。请多使用vim的环境设置功能

 
Links: Resources in CSDN, http://book.csdn.net/

 

 

vi使用方法       

        分类:            Linux637人阅读评论(0)收藏举报
开始接触linux了,文本编辑器是最基础的部分,听不少人说vi功能强大,虽然入门有些费事,但使用熟练后绝对方便,因此下决心学习vi了,下面是从网上找的一个vi入门文章,以后不懂就来看看了:)
vi编辑器是所有Unix及Linux系统下标准的编辑器,它的强大不逊色于任何最新的文本编辑器,这里只是简单地介绍一下它的用法和一小部分指令。由于对Unix及Linux系统的任何版本,vi编辑器是完全相同的,因此您可以在其他任何介绍vi的地方进一步了解它。Vi也是Linux中最基本的文本编辑器,学会它后,您将在Linux的世界里畅行无阻。
1、vi的基本概念   基本上vi可以分为三种状态,分别是命令模式(command mode)、插入模式(Insert mode)和底行模式(last line mode),各模式的功能区分如下:
1) 命令行模式command mode)
  控制屏幕光标的移动,字符、字或行的删除,移动复制某区段及进入Insert mode下,或者到 last line mode。
2) 插入模式(Insert mode)
  只有在Insert mode下,才可以做文字输入,按「ESC」键可回到命令行模式。
3) 底行模式(last line mode)
  将文件保存或退出vi,也可以设置编辑环境,如寻找字符串、列出行号……等。
不过一般我们在使用时把vi简化成两个模式,就是将底行模式(last line mode)也算入命令行模式command mode)。
2、vi的基本操作 a) 进入vi
  在系统提示符号输入vi及文件名称后,就进入vi全屏幕编辑画面:
   $ vi myfile
  不过有一点要特别注意,就是您进入vi之后,是处于「命令行模式(command mode)」,您要切换到「插入模式(Insert mode)」才能够输入文字。初次使用vi的人都会想先用上下左右键移动光标,结果电脑一直哔哔叫,把自己气个半死,所以进入vi后,先不要乱动,转换到「插入模式(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是用小写英文字母「h」、「j」、「k」、「l」,分别控制光标左、下、上、右移一格。
  按「ctrl」+「b」:屏幕往“后”移动一页。
  按「ctrl」+「f」:屏幕往“前”移动一页。
  按「ctrl」+「u」:屏幕往“后”移动半页。
  按「ctrl」+「d」:屏幕往“前”移动半页。
  按数字「0」:移到文章的开头。
  按「G」:移动到文章的最后。
  按「$」:移动到光标所在行的“行尾”。
  按「^」:移动到光标所在行的“行首”
  按「w」:光标跳到下个字的开头
  按「e」:光标跳到下个字的字尾
  按「b」:光标回到上个字的开头
  按「#l」:光标移到该行的第#个位置,如:5l,56l。
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」后,会在文件中的每一行前面列出行号。
B) 跳到文件中的某一行
 「#」:「#」号表示一个数字,在冒号后输入一个数字,再按回车键就会跳到该行了,如输入数字15,再回车,就会跳到文章的第15行。
C) 查找字符
 「/关键字」:先按「/」键,再输入您想寻找的字符,如果第一次找的关键字不是您想要的,可以一直按「n」会往后寻找到您要的关键字为止。
 「?关键字」:先按「?」键,再输入您想寻找的字符,如果第一次找的关键字不是您想要的,可以一直按「n」会往前寻找到您要的关键字为止。
D) 保存文件
 「w」:在冒号输入字母「w」就可以将文件保存起来。
E) 离开vi
 「q」:按「q」就是退出,如果无法离开vi,可以在「q」后跟一个「!」强制离开vi。
 「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前面的:)
posted @ 2013-06-16 01:13  Agoly  阅读(486)  评论(0编辑  收藏  举报