vi很常用,这里记录一下简单的用法,以利于未来用到或忘记时快速查阅。
vi的模式
- 命令模式(command mode): 执行vi命令后默认进入命令模式。
- 插入模式(insert mode): 在命令模式按'i'键,进入插入模式。按ESC键退出插入模式返回到命令模式。
- 末行模式(last line mode): 在命令模式按':'键,进入末行模式。退出末行模式返回命令模式有两种方法,方法1是按ESC键返回命令模式,方法2是输入末行命令按enter键执行,等末行命令执行结束,就自动返回命令模式。
每种模式都有各自的命令,命令模式有命令模式的命令,插入模式有插入模式的命令,末行模式有末行模式的命令。
保存文件(save; write)、退出vi编辑器(quit)
以下命令需在末行模式输入和执行
- :w 保存文件,把文件内容写入到当前文件。
- :wq 先保存后退出vi:
- :q 退出vi
- :q! 强制退出vi
- :r filename 把其他路径下的文件内容导入到当前文件光标所在行的下面。
- :w filename 把当前文件的内容写入到其他的文件里,就是“另存为”操作。执行这个命令时,当前文件内容的修改不会写入到当前文件(原始文件)。
命令模式进入插入模式的方法
- 按i键 从光标所在位置的左侧(前面),进入插入模式
- 按a键 从光标所在位置的右侧(后面),插入插入模式
- 按A键 把光标移动到光标所在行的尾部,进入插入模式
- 按o键 在光标所在行的下面插入新行,把光标移动到新行的行首,进入插入模式
- 按O键 在光标所在行的下面插入新行,把光标移动到新行的行首,进入插入模式
移动光标
以下4个键在命令模式和插入模式都可以使用
- 按Home键可以把光标移动到光标所在行行首。
- 按End键可以把光标移动到光标所在行行尾。
- 按PgUp键可以往上翻页,实现光标往上快速移动。
- 按PgDn键可以往下翻页,实现光标往下快速移动。
以下命令需在命令模式输入和执行
行内移动光标
- 0 功能与^相同。
- ^ 把光标移动到光标所在行的行首。
- $ 把光标移动到光标所在行的行尾。
- N + 把光标往后移动N个字符。(好像可以跨行)
- N + 把光标往前移动N个字符。(好像可以跨行)
- b 把光标移动到当前光标所在位置的前一个单词的首字母。
- w 把光标移动到当前光标所在位置的后一个单词的首字母。
- e 把光标移动到当前光标所在位置的后一个单词的尾字母。
- 5b 往前移动5个单词。
- 5w 往后移动5个单词。
- 5e 往后移动5个单词。
- Ctrl + 左后方向键
行间移动光标
- gg 把光标移动到第一行。是1G的快捷方式。
- G 把光标移动到最后一行。
- NG 把光标移动到第N行。1G就是移动到第1行。
- N + 从光标所在行开始把光标往后(下)移动N行。
- H (high) 把光标移动到屏幕上面
- M (middle) 把光标移动到屏幕中间
- L (low) 把光标移动到屏幕下面
其他移动光标命令
- h 左移光标
- l 右移光标
- k 上移光标
- j 下移光标
- ctrl + f 光标向前翻整页
- ctrl + b 光标向后翻整页
- ctrl + d 光标向前翻半页
- ctrl + u 光标向后翻半页
复制(copy)
以下命令需在命令模式输入和执行
- yy命令复制光标所在行。
- y^命令复制光标所在位置至行首的全部字符。
- y$命令复制光标所在位置至行尾的全部字符。
- 5yy命令 从光标所在行开始往下复制5行。
- yw命令复制光标所在位置至当前单词尾部的全部字符。
在末行模式输入以下命令执行
- :s,ey 复制第s行至第e行之间的所有行,如:50,100y复制第50行至100行之间的所有行。
粘贴(paste)
以下命令需在命令模式输入和执行
- P命令 在光标所在位置前面粘贴
- p命令 在光标所在位置后面粘贴。
- 5p命令 在光标所在位置往后粘贴5次
删除(delete)
以下命令需在命令模式输入和执行
- dd命令删除光标所在行
- d^命令删除光标所在位置至行首的全部字符。
- d$命令删除光标所在位置至行尾的全部字符。
- dw命令删除光标所在位置至当前单词尾部的全部字符(含单词尾部的空格)。
- de命令删除光标所在位置至当前单词尾部的全部字符(不含单词尾部的空格)
- x命令删除光标所在位置后面的单个字符。
- J(大写字母)命令删除光标所在行行尾的换行符,等同于合并当前行和下一行的内容。
- 5dd命令 从光标所在行开始往下删除5行。
- 5dw命令 删除当前光标所在位置后面的共5个单词(含尾部的空格)。
- 5de命令 删除当前光标所在位置后面的共5个单词(不含尾部的空格)。
- 5x命令 删除当前光标所在位置后面的共5个字符。
- 5J命令 从光标所在行开始往下合并5行(通过删除每行行尾的换行符)。
在末行模式输入以下命令执行
- :d 删除光标所在行。
- :s,ed 删除第s行至第e行之间的全部行。
- :1,.d 删除第一行至光标所在行的全部行。
- :.,$d 删除光标所在行至最后一行的全部行。
- :1,$d 删除第一行至最后一行的全部行。慎用。
- :g/^.*$/d 删除第一行至最后一行的全部行。与上面的:1,$d功能相同。慎用。
- :g/^$/d 删除全部空白行。这个命令非常有用,删除文件空白行是使用频率较高的操作,使用tr命令和sed命令也可以实现。
![Linux 简单使用vi编辑器](/a2020/img/data-img.jpg)
删除文件空白行 - 执行:g/^$/d前
![Linux 简单使用vi编辑器](/a2020/img/data-img.jpg)
删除文件空白行 - 执行:g/^$/d后
查找(find; search)
以下命令需在命令模式输入和执行
- /待找字符串 往下查找,按n查找下一个,按N查找上一个。
- ?待找字符串 往上查找,按n查找下一个,按N查找上一个。
替换(replace; substitute)
查找和替换的命令语法 :[range]s/old/new/gc。
- 查找和替换的范围有: 行内(单行)查找和替换,行间(多行)查找和替换,整个文件内(从第一行到最后一行的全部行)查找和替换。
- range,指范围,指在哪一行或哪几行进行查找和替换。range是可以缺少的。缺少range时,会在光标所在行进行查找和替换操作。
- g指global,指全局查找和替换,找到目标字符串在每一行的每一个位置,进行替换。
- c指comfirm,指确认是否执行查找和替换操作。
行内(单行)查找和替换
- :s/old/new 在光标所在行执行一次查找和替换。何为行内一次查找和替换?从行首开始查找目标字符串,找到了它第一次出现的位置,执行替换操作,然后结束,不再往下进行查找和替换。
- :s/old/new/g 在光标所在行执行全部(全局)查找和替换。
行间(多行)查找和替换
- :,s/old/new 在行间的每一行执行一次查找和替换。
- :,s/old/new/g(c) 在行间的每一行执行全部(全局)查找和替换。
- :.,$s/old/new/ 在光标所在行与最后一行之间的每一行执行一次查找和替换。
- :.,$s/old/new/g 在光标所在行与最后一行之间的每一行执行全部(全局)查找和替换。
在整个文件内(第一行与最后一行之间)进行查找和替换
- :%s/old/new/ 在第一行和最后一行之间的每一行执行一次查找和替换。
- :%s/old/new/g(c) 在第一行和最后一行之间的每一行执行全部(全局)查找和替换。
- %指百分百,就是指查找和替换的范围为整个文件,为第一行到最后一行的全部行。
查找和替换的例子
- :%s/^(.*)$/thinkdecideact: 1/g 在每行行首插入'thinkdecideact: '这个字符串。其中,'^(.*)$'匹配整行,1是反向引用(back reference),指前面正则里第一个分组匹配到的内容,即一整行数据。
- :%s/^(.*)$/1(thinkdecideact)/g 在每行行尾插入'(thinkdecideact)'这个字符串。
- :%s/^(life)/Good quote: 1/g 在以life开头的每一行行首添加'Good qutoe: '这个字符串。
- :%s/best/&/gn 统计整个文件里best这个字符串在整个文件中出现的次数。
![Linux 简单使用vi编辑器](/a2020/img/data-img.jpg)
查找和替换例子 - 原始文件内容
![Linux 简单使用vi编辑器](/a2020/img/data-img.jpg)
查找和替换例子 - 在每行行首添加一个字符串
![Linux 简单使用vi编辑器](/a2020/img/data-img.jpg)
查找和替换例子 - 在每行行尾添加一个字符串
![Linux 简单使用vi编辑器](/a2020/img/data-img.jpg)
查找和替换例子 - 在以life开头的每一行添加一个字符串
取消(undo; cancel)
命令模式下输入以下命令执行
- u命令取消最近一次操作,并恢复操作结果;可以多次使用u命令,不断往后取消恢复之前的结果(往后移动)。
- U命令取消对光标所在行进行的全部操作。
- Ctrl + R组合键恢复u命令取消的操作(往前移动)。(R是recover, restore之意)
什么是当前行?什么是当前单词?
光标所在行就是当前行。光标所在的单词就是当前单词。