书签

可以让 vi 在文件中的特定位置放上书签。方法是按 Escape 键,再按 M 键,然后输入另一个表示书签引用的字母表字符。因此,最多可以有 26 个书签,分别名为 a 到 z。要返回到上一书签,按 Escape 键,再按反撇号`),然后输入书签引用字符。

例如,按 Escape 之后按 M 和 A 键,就会把当前游标位置保存在书签 a 中。在编辑会话中,以后希望返回到这个游标位置时,只需按 Escape,然后输入 `A。可以使用双反撇号``)命令在当前书签和前一个书签之间切换。

查找、更新、查找下一个、重复

在 vi 编辑器中,最有用的搜索/替换特性之一是查找与某个模式匹配的字符串,更新它,然后继续搜索下一个匹配的字符串,然后选择是否以相同方式更新它。这与 Microsoft® Word 中的查找下一个/替换功能很相似。

您可能已经知道可以在 vi 中搜索字符串模式,方法是进入命令模式,输入 /search_pattern其中的 search_pattern 是字符串或正则表达式),然后按回车。这样做就会找到与指定的模式匹配的第一个字符串。在此之后,可以在找到的文本上执行任何操作。例如,按 Escape,再按 C 和 W 键,再输入更多文本,就会把找到的字符串替换为另一个单词。

要想快速地找到与模式匹配的下一个地方,应该按 Escape,然后按 N 键。在找到下一个匹配时,可以使用点号键.)在这个位置重复最近的文本操作,比如前一个示例中使用的修改单词cw)操作。然后,可以使用这些键继续寻找其他匹配n)并选择重复文本操作.),操作方式与使用 Word 中的查找下一个/替换功能很相似。

切换大小写

在 vi 中,可以切换游标下的字母字符的大小写,方法是按 Escape,然后按波浪号键~)。这会在小写和大写之间来回切换。按着这个键,移动游标经过行中的每个字符,就会切换遇到的每个字母字符的大小写。可以在波浪号前面输入一个数字,表示希望改变多少个字母字符的大小写。

筛选

您可能知道,在 vi 中按 Escape,输入 :!command其中的 command 是要执行的 UNIX 命令),然后按回车,就可以在 shell 中执行命令。例如,:!pwd 显示编辑会话当前的工作目录。

但是,还可以把文件的一部分作为标准输入发送给 UNIX 命令,并用产生的输出替换编辑缓冲区中的相同部分。例如,如果希望在 vi 会话内对 清单 9 所示的整个文件进行排序,可以按 Escape,输入 :1,$!sort 并按回车,这让 vi 把从第一行到文件末尾$)的所有内容传递给 sort 命令,用输出替换指定的部分。

清单 9. 在 vi 会话内执行文件排序排序之前)

5
4
3
2
7
6
5
4
8
9
6
3
1
3
4
~
~
:1,$!sort

清单 10 显示 sort 操作的结果。

清单 10. 在 vi 会话内执行文件排序排序之后)

1
2
3
3
3
4
4
4
5
5
6
6
7
8
9
~
~
:1,$!sort

另外,还可以在 shell 命令前面加上从当前游标位置开始希望操作的行数。方法是按 Escape,然后输入指定行数的数字,然后输入两个惊叹号!!),最后输入 UNIX 命令。

例如,把游标放在 清单 9 中第 4 行的开头,按 Escape,然后输入:

4!!awk '{print "New text",$0}'

再按回车,就会在第 4 到第 7 行含)上加上前缀文本 New text,见 清单 11。

清单 11. 在多个代码行前面加上新文本

5
4
3
New text 2
New text 7
New text 6
New text 5
4
8
9
6
3
1
3
4
~
~
!awk '{print "New text",$0}'

可以使用管道分隔符|)把 UNIX 命令连接在一起,从而在 vi 会话中执行复杂强大的筛选。例如,假设要把当前 vi 会话的编辑缓冲区中的文件内容替换为每行的第一个空格分隔的字段,按升序排序并转换为大写,那么在按 Escape 之后输入:

:1,$!awk '{print $1}' | sort | tr [:lower:] [:upper:]

保存部分内容

可以保存当前编辑的文件的部分内容,方法是按 Escape,然后输入 :start,endw file,其中的 start 是当前文件中要保存的第一行,end 是要保存的最后一行,w 表示希望写到另一个文件中或者覆盖现有的文件),file 是指定的部分要保存到的文件。对于最后一行,可以使用 $ 表示文件的末尾。可以在 w 后面使用两个大于号>>)表示希望把内容附加到文件中而不是覆盖文件。清单 12 中的示例把第 6 到第 9 行含)附加到文件 /tmp/newfile 中。

清单 12. 把文件的部分内容保存到另一个文件中附加而不是覆盖)

1 #
2 # Internet host table
3 #
4 ::1 localhost
5 127.0.0.1 localhost loghost
6 192.168.0.6 centos5
7 192.168.0.10 appserv
8 192.168.0.11 webserv
9 192.168.0.12 test
10 192.168.0.5 solaris10 # Added by DHCP
~
~
~
:6,9w >> /tmp/newfile

vi 编辑器是一个极其强大的工具,本文提供了一些技巧和诀窍,希望能够帮助您更高效地编辑文件。请记住,vi 还有更多不太为人所知的特性。祝工作愉快!


相关内容