7.1 熟练使用vim

系列 - LINUX VIM和Shell基础
摘要

本文主要介绍了如何使用 Vim 编辑器编辑文件,包含以下几个方面:

  1. 启动和退出 Vim:介绍了如何启动 Vim 编辑器,以及如何退出 Vim 编辑器。包括使用命令 :q、:w、:wq 和 :x。
  2. 查找:介绍了如何在 Vim 中进行查找,包括使用 / 进行查找,以及使用 n 和 N 键进行查找下一个或查找上一个。
  3. 替换:介绍了如何在 Vim 中进行替换,包括使用 s/word1/word2/g 命令进行替换。
  4. 编辑:介绍了如何在 Vim 中进行编辑,包括使用 x 删除当前字符、使用 dd 删除当前行、使用 dG 删除当前位置到最后一行等。

1、在图形界面中,在 root 的家目录建立一个文本文件,文件名为 file.txt 其内容为:

text

abc
123

2、拷贝一份 sshd 的配置文件到家目录

bash

cp /etc/ssh/sshd_config /root

1、输入命令 vimvim filename 可以打开 vim

bash

vim /root/file.txt
vim界面

2、vim有三个模式:

(1)一般模式 进入vim之后,首先进入的就是一般模式。进入一般模式后,vim等待编辑命令而不是文本输入。 进入一般模式后光标停在屏幕第一行首位,其余各行的行首均有一个“~”符号,表示该行为空行。

(2)编辑模式 在一般模式下按下 i 键可以进入编辑模式。在编辑模式下,用户输入的任何字符都被vim当作文件内容保存起来,并将其显示在屏幕上。在文本输入过程中(插入模式下),若想回到一般模式下,按“Esc”键即可。

(3)命令模式 在编辑模式下,用户按 : 键即可进入命令模式。此时vim会在显示窗口的最后一行(通常也是屏幕的最后一行)显示一个“:”作为命令模式的提示符,等待用户输入命令。 多数文件管理命令都是在此模式下执行的。 命令执行完后,vim自动回到编辑模式。 若在命令模式下输入命令的过程中改变了主意,可在用退格键将输入的命令全部删除之后,再按一下退格键,即可使vim回到一般模式。

在命令模式下:

  • q 命令退出(quit)
  • w 命令保存(write)
  • wq 保存并退出
  • x 等同于 wq(一定要注意是小写,大写的意思是加密保存)

1、在一般模式下,输入 / 进行查找

例如查找 sshd_config 中的 HostKey

此时按 n 键进行“查找下一个”:

n 是 next 的缩写 按 N 可以“查找上一个”

1、替换的命令是:

bash

n1,n2 s/word1/word2/g
  • n1与n2为数字。在第n1~n2行寻找word1这个字符串,并将该字符串取代为word2。
    • 举例来说,在100~200行查找 myweb 并取代为MYWEB则输入100,200 s/myweb/MYWEB/g
    • 如果想要在整个文件所有行中进行替换,可以用 % 替代 n1,n2
    • 如果从第 n1 行到文件结尾,可以用 n1,$ s/word1/word2/g
  • s 是 substitute 的缩写,意为“替换”
  • g 代表全局,如果不加g,每行只替换一次
  • x 删除当前字符
  • dd 删除当前行(delete)
    • 2dd 删除2行
    • 5dd 删除5行
  • dG 删除当前位置到最后一行
  • d1G 删除当前位置到第一行
    • dgg 作用一样
    • 在其他场合也是,1G 相当于 gg

至少记住前两个!

1、sshd 的配置文件中,有几个 want ?

不知道什么时候查找到结尾了?试试 set nu 命令

2、将 sshd 配置文件中的所有 you 替换为 @YOU@

练习目的
  1. 将刚刚读过的内容做一遍巩固;
  2. 将没有讲的内容(不是特别常用)进行了解,万一记住一两个呢
  1. 在/tmp目录下建立一个名为mytest的目录,进入mytest目录当中。
  2. 将/etc/man_db.conf复制到上述目录下面,使用vim打开目录下的man_db.conf文件。
  3. 在vim中设定行号,移动到第58行,向右移动15个字符,请问你看到的该行前面15个字母组合是什么?
  4. 移动到第一行,并且向下查找“gzip”字符串,请问它在第几行?
  5. 将50~100行的man字符串改为大写MAN字符串,并且逐个询问是否需要修改,如何操作?如果在筛选过程中一直按“y”键,结果会在最后一行出现改变了多少个man的说明,请回答一共替换了多少个man。
  6. 修改完之后,突然反悔了,要全部复原,有哪些方法?
  7. 需要复制65~73这9行的内容,并且粘贴到最后一行之后。
  8. 删除23~28行的开头为#符号的批注数据,如何操作?
  9. 将这个文件另存成一个man.test.config的文件。
  10. 到第27行,并且删除8个字符,结果出现的第一个单词是什么?在第一行新增一行,该行内容输入“I am a student…”;然后存盘后离开。

参考步骤

  1. 输入mkdir /tmp/mytest; cd /tmp/mytest。
  2. 输入cp /etc/man_db.conf .; vim man_db.conf。
  3. 输入:set nu,然后你会在画面中看到左侧出现数字即为行号。先按下“5+8+G”组合键再按下“1+5+→”组合键,会看到:# on privileges.。
  4. 先执行1G或gg后,直接输入/gzip,应该是第93行。
  5. 直接下达“:50,100 s/man/MAN/gc”即可!若一直按“y”键最终会出现“在15行内置换26个字符串”的说明。
  6. 简单的方法可以一直按“u”键回复到原始状态;使用不储存离开:q!命令之后,再重新读取一次该文件也可以。
  7. 执行65G然后再执行9yy之后最后一行会出现“复制9行”之类的说明字样。按下“G”键到最后一行,再按下p,则会在最后一行之后粘贴上述9行内容。
  8. 执行23G→6dd就能删除6行,此时你会发现光标所在23行的地方变成MANPATH_ MAP开头了,批注的 # 符号那几行都被删除了。
  9. 执行:w man.test.config,你会发现最后一行出现“man.test.config”[New]..”的字样。
  10. 输入27G之后,再输入8x即可删除8个字符,出现MAP的字样;执行1G移到第一行,然后按下大写的O键,便新增一行且位于插入模式;开始输入I am a student…后,按下“Esc”键回到一般模式等待后续工作;最后输入:wq。