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
分类: 系统运维
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的环境设置功能
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前面的:)
作者:Agoly 出处:https://www.cnblogs.com/qmfsun/ 本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。 如果文中有什么错误,欢迎指出。以免更多的人被误导。 |