2020年3月4日 星期三

vi修改文本

如何修改编辑缓冲区已有的数据?首先,我们讨论7条vi命令,,除了一种情况外,其它情况都需要切换到输入模式。下面先从这个不需要切换到输入模式的命令入手。

为了用一个字符切换到另一个单独的字符,可以键入r,后面跟着新字符。例如,假设您正向教授写信,解释无法按时完成学期论文的原因。您现在位于命令模式中,而当前行是:

would mean missing The Sopranos rerun. I gm sure you
您注意到“gm”有错误,将光标移动到“g”上,然后键入:

ra

当前行将被修改为:

would mean missing The Sopranos rerun. I am sure you
因为您只修改一个字符,所以没必要进入输入模式。

假定您希望重写不止一个字符,那么首先应将光标移动到希望开始替换的位置,然后键入R(大写字母“R”),您将切换到输入模式,随后键入的每个字符都将替换当前行上的每一个字符。当结束键入后,可以按<Esc>键返回到命令模式。下面举例说明。当前行如上述例子所示,将光标移动到“The”中的T处,然后键入:

RMa’s funereal<Esc>
当前行现在变成了:

would mean missing M$’s funeral. I am sure you
$显示哪个个字符将被替换。键入自己希望的字符之后,可以按<Esc>键结束键入,假设您键入了:

other<Esc>
现在当前行变为:

would mean missing Mother’s funeral. I am sure you
C(大写字母“C”)命令是这种类型的改变的一种变体。它允许替换从当前光标位置搭配这一行末尾的所有字符。在我们的例子中,假设光标位于字母I处,这是键入:

C
这样将切换到输入模式,并且最后一个待替换的字符被用一个$标记:

would mean missing Mother’s funeral. I am sure you$
当前字符是“I”。键入希望的内容,然后按<Esc>键。假设键入的内容是:

We all hoped that<Esc>
现在当前行变为;

would mean missing Mother’s funeral. We all hoped that
有时候,最容易的事情就是替换一整行。有两条命令可以完成这一任务,它们分别是Scc。只需将光标移动到希望替换的那一行,然后键入这两条命令中的一条,这样就会进入输入模式。当按<Esc>键,所键入的内容就替换掉这一整行。

为什么两条作用相同的命令却拥有完全不同的名称呢?许多vi命令的名称都遵循一种命令模式。有的名称只有一个小写字母,有的是两个小写字母,有的是一个大写字母。根据这种模式,Scc都应该是替换一整行的命令。因此,可以选择使用其中任意一个。

最后一个替换数据的vi命令相当有用,该命令就是c后面跟一个移动光标的命令。再一次说明,这样也会进入输入模式。但是,这一次键入的内容将替换从光标当前位置到由移动命令所指定的位置之间的所有字符。该命令很容易混淆,因此下面举几个例子说明一下,假设当前行是:

would mean missing Mother’s funeral. We all hoped that
光标位于字母“M”处。您希望将整个单词“Mother”替换为“my dog”。因此键入:

cw

这将切换到输入模式,并用一个$标记待替换的最后一个字符。这时会看到:

would mean missing Mothe$’s funeral. We all hoped that
现在键入:

my dog<Esc>
当前行变为:

would mean missing my dog’s funeral. We all hoped that
因此,cw组合可以改变一个单词。c可以与任意一个单字符的光标移动命令组合使用。如果愿意,还可以使用重复次数。例如,命令c5w替换5个单词,命令c4b从当前位置向后替换4个单词。命令c(从当前位置开始替换到句子的开头。命令c)从当前位置开始替换到段落的末尾。为了替换6个段落,可以将光标移动到第一个段落的开头,键入c6}。

vi替换命令总结如下:

r 精确替换一个字符(不进入输入模式)

R 已覆盖方式替换

s 以插入方式替换一个字符

C 以插入方式从当前光标替换到这一行的末尾

cc 以插入方式替换当前的整行

S 以插入方式替换当前的整行

cmove 以插入方式从当前光标替换到move所给出的位置处

沒有留言:

張貼留言