Shell系列之文件编辑器

avatar
奇舞团移动端团队 @奇舞团

文件编辑器,允许在文件中插入、编辑和替换文本等操作。

本文主要介绍vim编辑器和nano编辑器的简单使用,目前macOS是支持这两种编辑器的。

vim编辑器

vi编辑器是Unix系统最初的编辑器,后来被GNU项目改进后,称为vi improved,简称:vimLinux移植了vim编辑器。

macOS系统可以使用viview,也可以使用vim

#查看vim的文件路径
qwldeMacBook-Pro:~ qwl$ which vim
/usr/bin/vim
qwldeMacBook-Pro:~ qwl$ ls -l /usr/bin/vim
-rwxr-xr-x  1 root  wheel  2129184  7 10 06:26 /usr/bin/vim
qwldeMacBook-Pro:~ qwl$ which vi
/usr/bin/vi
#软链指向vim
qwllideMacBook-Pro:~ qwl$ ls -l /usr/bin/vi
lrwxr-xr-x  1 root  wheel  3 10 11  2019 /usr/bin/vi -> vim
qwldeMacBook-Pro:desktop qwl$ which view
/usr/bin/view
#软链指向vim
qwldeMacBook-Pro:desktop qwl$ ls -l /usr/bin/view
lrwxr-xr-x  1 root  wheel  3 10 11  2019 /usr/bin/view -> vim

通过上述终端查看,可以发现viviewvim的联系:viview是链接文件,最终指向了vim

vim基础

vim编辑器启动的命令格式:vim filenamevi filename。若filename为空,或filename文件不存在,vim会开辟新的缓冲区来编辑;若filename不为空,则vim会将文件整个内容都读取到缓冲区,准备编辑,若读取的文件内容不足以显示一屏,vim会在非文件内容行放置一个波浪线~

vim编辑器有两种操作模式:

  • 普通模式:当刚打开要编辑的文件时(或新建一个文件时),vim编辑器会进入普通模式。在普通模式中,vim编辑器会将键盘按键解释成命令。
  • 插入模式:在插入模式下,vim会将当前光标位置输入的每个键都插入到缓冲区。按下i键就可以进 入插入模式。要退出插入模式回到普通模式,按下键盘上的退出键esc

普通模式,使用键盘的上下左右,可控制光标的移动,也有代替键盘的控制光标移动的命令:

h:左移一个字符 j:下移一行 k:上移一行 l:右移一个字符 ctrl+f:下翻一屏 ctrl+b:上翻一屏 G:移动到缓冲区的最后一行 num G:移动到缓冲区的第numgg:移动到缓冲区的第一行

普通模式下有个特殊的功能,叫命令行模式。命令行模式提供了一个交互式命令行,可以输入额外的命令来控制vim的行为。通过在普通模式下输入冒号::,可以进入vim编辑器的命令行模式。 在命令行模式下有几个命令可以将缓冲区的数据保存到文件中并退出vim:

q:如果未修改缓冲区数据,退出 q!:取消修改并退出 w filename:将文件保存到另一个文件中 wq:将缓冲区数据保存到文件中并退出

在插入模式下,你可以向缓冲区插入数据。然而有时将数据输入到缓冲区中后,你需要再对其进行添加或删除。在普通模式下,vim编辑器提供了一些命令来编辑缓冲区中的数据:

x:删除当前光标所在位置的字符 num x:删除当前光标所在位置开始的num个字符 dd:删除当前光标所在的行 num dd:删除当前光标所在的行开始的num行。 dw:删除当前光标所在位置的单词 num dw:删除当前光标所在位置开始的num个单词 J:删除当前光标所在行行尾的换行符 u:撤销前一个编辑的命令 a:在光标后追加数据 A:在当前光标所在行的行尾追加数据 r char:用char替换当前光标所在位置的单个字符 R text:用text覆盖当前光标所在位置的数据,直到按下ESC键

vim编辑器的剪切和粘贴

vim在删除数据时,会将数据保存在单独的一个寄存器中,可以用p命令取回数据。

dd + p:整行数据的剪切与粘贴 x+p: 单个字符的剪切与粘贴 dw+p:单个单词的剪切与粘贴

vim编辑器的复制和粘贴

vim中复制命令是y(代表yank)。可以在y后面使用和d命令相同的第二字符(yw表示复制一个单词,y$表示复制到行尾)。在复制文本后,把光标移动到想放置文本的地方,输入p命令。复制的文本就会出现在该位置。

yy:复制整行,可加 num yw:复制单词,可加num y:复制单个字符,可加num y$:从当前光标位置复制到行尾

vim编辑器的可视化复制

上述的复制方法,我们无法知道复制的是什么。vim编辑器提供了一种可视化模式,来解决这个问题。 要进行可视化模式复制,首先要将我们的光标移动到文本开始复制的位置,然后按下v键,最后控制光标移动的命令或键盘,进行选择要复制的文本即可。使用p进行粘贴。

vim编辑器的查找和替换

查找:普通模式下要查找字符串,首先按下斜杠键/,接着输入要查找的字符串,按enter键进行查找,默认 enter之后的编辑器会有以下三种行为:

  • 如果要查找的文本出现在光标当前位置之后,则光标会跳到该文本出现的第一个位置。
  • 如果要查找的文本未在光标当前位置之后出现,则光标会绕过文件末尾,出现在该文本所在的第一个位置(并用一条消息指明)。
  • 输出一条错误消息,说明在文件中没有找到要查找的文本。

若要继续查找同一个字符串,有两种方式:

  • 输入/,按enter
  • n键,意为:next

替换:必须进入命令模式才能使用替换,即普通模式下使用冒号:进入命令模式。替换的命令格式如下::s/old/new/ 光标移动到字符串替换开始的位置,进入命令行模式,输入s/old/newvim编辑器会跳到光标处的old,并用new来替换。

可以对替换命令作一些修改来替换多处文本:

  • :s/old/new/g:替换一行中出现的所有oldnew
#文本:hello hello hello hello hello word!
#光标移动至替换开始的位置(第一个hello的h处),并输入
:s/hello/hi/g
#输出
hi hi hi hi hi word!
  • :num s/old/new/g:替换第num行中出现的所有oldnew
#大漠孤烟直
#hello word!
#hello hello hello hello hello word!
#hello word!
#长河落日圆

#输入
:2 s/hello/hi/g
#输出:

#大漠孤烟直
#hi word!
#hello hello hello hello hello word!
#hello word!
#长河落日圆
  • :n,m s/old/new/g:替换n行到m行中出现的所有oldnew
#大漠孤烟直
#hello word!
#hello hello hello hello hello word!
#hello word!
#长河落日圆

#输入
:2, 4 s/hello/hi/g
#输出:

#大漠孤烟直
#hi word!
#hi hi hi hi hi word!
#hi word!
#长河落日圆
  • :% s/old/new/g:替换整个文件中的所有old
  • :%s/old/new/gc:替换整个文件中的所有old,但在每次出现时提示:replace with hi (y/n/a/q/l/^E/^Y)?

nano编辑器

nano文本编辑器也是从Unix系统移植过来的,它的使用就很简单,许多命令,都会显示在编辑器窗口的下方,可以按照这些命令提示轻松使用它: nano编辑器 关于启动nano编辑器:nano filename,关于filenamevim编辑器的处理相同。

参考资料

Linux命令行与shell脚本编程大全