![Ex/vim ex-mode 和 sed 是截然不同的实用程序,还是执行相同任务的两个不同程序](https://linux22.com/image/1539671/Ex%2Fvim%20ex-mode%20%E5%92%8C%20sed%20%E6%98%AF%E6%88%AA%E7%84%B6%E4%B8%8D%E5%90%8C%E7%9A%84%E5%AE%9E%E7%94%A8%E7%A8%8B%E5%BA%8F%EF%BC%8C%E8%BF%98%E6%98%AF%E6%89%A7%E8%A1%8C%E7%9B%B8%E5%90%8C%E4%BB%BB%E5%8A%A1%E7%9A%84%E4%B8%A4%E4%B8%AA%E4%B8%8D%E5%90%8C%E7%A8%8B%E5%BA%8F.png)
我知道 sed(流编辑器)是一种非交互式编辑器,可用于编写脚本和批处理。我还知道 ex 及其 vim 调用:ex-mode 是用于非交互式文本处理的行编辑器。我的问题不是关于哪个更好或更有用,而是 ex/ex-mode 是否有任何预期的用例或优势使其有别于 sed。我问这个问题的原因是想确定我是否因为忽略 ex-mode 而选择 sed 而错过了什么。提前致谢。
答案1
之间的一个主要区别前任和sed前者(至少在 Vim 实现中)将整个文件读入缓冲并据此进行操作。而 sed 中的“s”代表流媒体即 sed 逐行读取输入文件,并即时输出。因此,sed 可以轻松处理非常大的文件,而 ex / Vim 则需要操作系统的虚拟地址空间,并且读写速度会慢得多。
因此,使用 sed 时,如果您需要保留前几行的上下文,则必须明确将其与模式空间或将其存储在单个可用保持空间。而在 ex / Vim 中,您可以导航回上一行或使用跨缓冲区中多行的正则表达式。此外,不仅有一个保持空间,但有多个命名寄存器在 Vim 中(称为命名缓冲区例如)。因此,如果单个存储空间不够,则必须从 sed 升级到awk(以保持流媒体方面),或者切换到 ex / Vim。
在实践中
如果我已经在 Vim 中打开了一个文件,我自然会使用超前模式用于某些文本操作。:substitute
是最常用的命令之一(至少对我来说)。许多 ex 命令都有相应的(通常是递归的)宏实施;根据任务(和个人喜好/能力),您倾向于更频繁地使用其中一个。
对于自动化任务,我更喜欢sed
/ awk
/Perl
工具链;这里的好处是,你可以从小处着手(使用 sed),一旦达到其功能的极限,你就可以很容易地迁移到下一个工具,它更强大(但也更复杂、更大)。如果这是一次性的自动化任务,而且我已经知道一个漂亮的宏或 Vim 插件可以大大简化实现,我会考虑使用 Vim 作为非交互式命令行实用程序静音模式。对于其他任务,这通常不是一个选项,因为存在依赖关系(对 Vim、插件、我的个人配置)。
概括
你可以用 sed 做很多事情,不需要其他任何东西。如果你不是 Vim 用户(特别是如果你使用其他编辑器,并可以在其中进行强大的文本处理),ex(模式)并不是那么重要,但也不会太远,因为它的语法与 sed 紧密相关。