在 linux vi 编辑器 中按 Escape,输入 :!command
(其中的 command 是要执行的 UNIX 命令),然后按回车,就可以在 shell 中执行命令。例如,:!pwd
显示编辑会话当前的工作目录。
但是,还可以把文件的一部分作为标准输入发送给 UNIX 命令,并用产生的输出替换编辑缓冲区中的相同部分。例如,如果希望在 vi 会话内对整个文件进行排序,可以按 Escape,输入 :1,$!sort
并按回车,这让 vi 把从第一行到文件末尾($
)的所有内容传递给 sort
命令,用输出替换指定的部分。
在 vi 会话内执行文件排序(排序之前)
5 4 3 2 7 6 5 4 8 9 6 3 1 3 4 ~ ~ :1,$!sort
显示 sort
操作的结果。
在 vi 会话内执行文件排序(排序之后)
1 2 3 3 3 4 4 4 5 5 6 6 7 8 9 ~ ~ :1,$!sort
另外,还可以在 shell 命令前面加上从当前游标位置开始希望操作的行数。方法是按 Escape,然后输入指定行数的数字,然后输入两个惊叹号(!!
),最后输入 UNIX 命令。
例如,把游标放在第 4 行的开头,按 Escape,然后输入:
4!!awk '{print "New text",$0}'
再按回车,就会在第 4 到第 7 行(含)上加上前缀文本 New text:
在多个代码行前面加上新文本
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:]