本章主要介绍如何使用vim编辑文件
- vim 的基本使用
- vim 几种模式的切换
- vim 在末行模式中的用法
- vim 在命令模式中的用法
在Linux中,很多时候需要使用编辑器来修改文件,使用最多的编辑器就是vim,用法如下。
- vim /path/file
如果这个文件不存在,则会在内存中创建出来,与在 Windows中单击【开始】→【所有 程序】→【记事本】的功能相同,只是在内存中打开,并没有存储在硬盘上。如果文件存 在,则把此文件打开。
环境准备的命令如下。
[root@rhel03-23 ~]# head /etc/passwd > aa.txt
先创建一个测试文件aa.txt,这里的意思是把/etc/passswd前10行的内容写入 aa.txt中。 然后执行vim aa.txt命令打开此文件,界面如下所示。
[root@rhel03-23 ~]# vim aa.txt
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
此时会发现按【Enter】键不会产生空白行,按【Backspace】键也不会删除任何字符,即现 在无法编辑。这里就涉及了vim的三种模式。
1、插入模式
用vim打开文件时,是在命令模式下,如果想修改文件内容,需要进入插入模式(也称为 编辑模式)。从命令模式切换到插人模式,有6个常见的字符。
- i:从当前光标所在字符处插入。
- a:从当前光标的后一个字符处插入。
- o:在当前行的下一行产生一个空白行并进入插入模式。
- I:光标跳到本行的开头,并进入插入模式。
- A:光标跳到本行的结束,并进入插入模式。
- O:在当前行的上一行产生一个空白行并进入插入模式。
用上、下、左、右键调整光标到合适的位置之后,把光标放在r的位置。按 【 i 】键进入插入模式,如下所示。
可以看到,光标仍然是在r上面的(这就叫作从当前光标所在字符插人),左下角显示 为“插入”或“insert”,此时就进入插入模式了。
然后可以通过上、下、左、右键调整位置对文件进行修改,例如,修改成下图所示的内容。
修改完成之后需要对文件进行保存,在插入模式下是无法保存的,必须进入末行模式才可 以。需要按【Esc】键退回到命令模式,然后从命令模式进入末行模式,如下图所示。
从插入模式退回命令模式
2、末行模式
从命令模式进入末行模式有两种方式。
2.1、/关键字
这种一般用于在文件中查询所有的关键字,如果想忽略大小写可以用“/关键字\c”。
例如,在passwd中查询所有的root,先按【/】键,然后在后面输入“root”,如下图所示。
此刻会高亮显示所有的关键字root,不过可以看到ROOT和Root并没有高亮显示出来,因 为在 Linux中是严格区分大小写的,如果想忽略大小写,可以写成/root\c,如下图所示。
但是此时被高亮显示:如果想去掉,可以随意输入一个字符串, 然后按【Enter】键,如下图所示。
这些高亮的印迹就没有了,下面“E486:找不到模式”的提示可以忽略,如果看着不舒 服,可以按【/】键之后按【 Backspace】键,就可以取消了。
2.2、在命令模式下按冒号
在命令模式下按冒号。这里可以执行各种操作,总结如下
- 保存但不退出::w
- 保存退出::wq
- 保存退出::x(小写)。
- 另存为::w /path/new-name。
- 加载其他文件::r /path/text-file。
- 显示行号::set nu
- 去除行号::set nonu。
- 切换行::数字,这样光标可以快速切换到指定的行。
- 替换操作:语法如下。
:s/old/new/
把root替换成RHCE,如下图所示。
按【Enter】键查看内容,如下图所示。
可以发现,只是第一行(光标在第一行)发生了替换,且只替换了那行的第一个关键字。如 果想把本行所有的关键字全部替换,需要写成:s/root/RHCE/g,这里g的意思是本行全部关键字。
此时按【u】键执行撤销操作,然后把本行所有的root(不管大小写)全部替换成RHCE, 写法如下图所示。
按【Enter】键后看第一行的内容,如下图所示。
按【u】键执行撤销操作
此时替换操作只是替换当前光标所在行,如果想替换指定的一些行,可以写成 :m,ns/old/new/g,意思是从第 m 行到第 n 行中所有的 old 全部替换成 new。假设现在想 把从第1行到第7行中所有的root(不管大小写)全部替换成RHCE,写法如下图所示。
按【Enter】键后的效果如下图所示。
按【u】键撤销。
这里还可以用$表示最后一行,对应的$-1表示倒数第二行,以此类推。
例如,想把从第二行到倒数第二行中所有的root(不管大小写)全部替换成RHCE,写法如下图所示。
按【Enter 】键查看效果,然后按【u】键撤销
如果想全文替换,可以写成:1,$s/old/new/g,这里1,S是从第一行到最后一行,表示全 文,还可以直接用%表示全文,即:%s/old/new/g。
替换完成之后,请自行按【u】键撤销。
刚才替换时用的是/作为分隔符,但如果关键字中就含有/,则很容易出错。例如,把第一 行的/root替换成RHCE,如果写成:s/root/RHCE/g,则会报错,因为我们希望按照下面的规则替换。
- :s//root/RHCE/g
但是它会把前面三个/作为分隔符,后面的字符是多余的。
- :s//root/RHCE/g
所以会报错,为了防止/root 中的/被当成分隔符,我们可以用转义符,如下所示。
- :s/\root/RHCE/g
这样就不会把/root的/当成分隔符了,但是这样写看起来过于复杂。其实我们不一定非得 用/作为分隔符,使用其他分隔符也是可以的,如#,这样替换操作就可以写成如下命令。
- :s#/root/#RHCE#g
3、命令模式
要想从末行模式切换到命令模式,只要按两次【Esc】键即可,如下图所示。
一开始在命令模式下无法做具体的操作(无法删除,按【Enter】键也没用),其实在命令 模式下也可以微许多操作。
(1)复制行。
nyy (n为数字)表示从当前行开始,一共复制n行。
把光标调整到第5行,此时按【3yy】键,就会把5、6、7三行复制下来, 如下图所示。
(2)粘贴行。
调整光标到指定的行之后,按【p】键执行粘贴操作。例如,这里在第10行即 shutdown 那行按【p】键,如下图所示。
自行按【u】键撤销
(3)剪切行。
ndd (n为数字)表示从当前行开始,一共剪切n行,用法与nyy类似。
但是如果不按【p】键粘贴,则这几行就是删除的意思。
如果想把从当前行开始到最后一行全部删除,可以按【dG】键或随便按一个比较大的数 字,然后按【dd】键,如【9999dd】。
(4)删除字符。
在光标所在的字符位置按【x】键,就可以删除此字符。如果想删除当前光标往后所有的 字符,可以按一个比较大的数字,然后按【x】键,如【9999x】。
(5)定位行。
按【nG】键(n为数字),光标跳到第n行。如果想切换到最后一行,直接按【G】键。如 果想跳到第一行,直接按【gg】键。(6)替换。
(6)替换。
如果想替换当前光标的字符,先按【r】键,然后按所要替换的字符就可以了。例如,当 前光标是在a上,如下图所示。
此时按一下【r】键,再按一个【9】键,这样就可以把a替换成【9】了,如下图所示。
按小写的【r】键只是做一次替换,如果想再替换其他字符,还需要按【r】键才行。如果 想一直处于替换状态,则需要按大写的【R】键,这样当替换当前字符之后,光标会跳到下 一个字符并处于替换状态,我们可以通过调整光标来替换所要替换的字符,直到按【Esc】 键结束。
(7)撤销。
如果编辑错了,可以按【u】键撤销,类似于 Word中的撤销操作。
(8)前进。
前进符,按【Ctrl+R】组合键。