Answers:
ex和sed之间的主要区别是前者(至少在Vim实现中)将整个文件读入缓冲区并对其进行操作。sed中的“ s”代表流式传输,即sed逐行读取输入文件,并在旅途中将其输出。因此,sed可以轻松处理非常大的文件,而ex / Vim将需要操作系统的虚拟地址空间,并且读写速度相当慢。
因此,使用sed时,如果您需要保留前几行的上下文,则必须将其与模式空间显式连接,或将其存储在单个可用的保留空间中。而在ex / Vim中,您可以导航回到上一行或使用跨缓冲区多行的正则表达式。而且,在Vim中不仅有单个保留空间,而且还有多个命名寄存器(在ex中称为命名缓冲区)。因此,如果单个存储空间不足,则必须从sed升级到awk(以保持流媒体方面),或切换到ex / Vim。
如果我已经在Vim中打开了文件,则自然会使用ex模式进行某些文本操作。:substitute
是最常用的命令之一(至少对我而言)。许多ex命令都有对应的(通常是递归的)宏实现;根据任务(和个人喜好/能力)的不同,您倾向于更频繁地使用一个或另一个。
对于自动化任务,我更喜欢sed
/ awk
/ Perl
工具链; 这里的好处是,您可以从小型(使用sed)开始,一旦达到其功能的极限,就可以轻松迁移到功能更强大(但也更复杂,更大)的下一个工具。如果这是一项一次性的自动化任务,并且我已经知道一个可以极大简化实现的漂亮的宏或Vim插件,那么我考虑将Vim用作无提示ex模式下的非交互式命令行实用程序。对于其他任务,由于依赖关系(对于Vim,插件,我的个人配置),通常不是一个选择。
只需sed,您就可以做很多事情,而没有其他事情。如果您不是Vim用户(特别是如果您使用其他编辑器,并且可以在其中执行强大的文本处理),则ex(mode)并不是那么重要,但永远不会远离,因为它的语法始终与sed保持一致。