![批处理的 EX 模式有何用途?](https://linux22.com/image/1212251/%E6%89%B9%E5%A4%84%E7%90%86%E7%9A%84%20EX%20%E6%A8%A1%E5%BC%8F%E6%9C%89%E4%BD%95%E7%94%A8%E9%80%94%EF%BC%9F.png)
这教程提到 Ex 模式用于批处理。由于它对我来说是一种麻烦,而不是一种工具,所以我想看看一些实际的例子。谁使用它?为什么?
批处理的 EX 模式有何用途?
答案1
Vim 的 Ex 模式 (也称为ex
) 在以下情况下很有用:
- 您需要以非交互方式(作为脚本的一部分)编辑(多个)文件。
- 您的连接非常慢或执行操作后屏幕没有更新。
- 映射和缩写被禁用。
- Escape或等常用键Control无法正常工作。
非交互编辑文件是最常见的用法,人们使用它的方式与sed
和类似awk
,但它们更面向流 - 它们只从头到尾读取文件,而vim
面向缓冲区 - 您可以根据需要在文件中向前和向后移动。其次,vim 的正则表达式比 awk 和 sed 的表达式更强大(它们不是为处理多行而设计的) - 例如 vim 可以匹配多行并支持零匹配。
Ex 也是一个编辑器(vi 的直接前身)并且在 Vim 中模拟 Ex 模式ex
(它们仍然运行相同的代码),因此可以ex
从 vi 内部进入命令模式,反之亦然。有 Ex 模式(vim -e
)和改进的 Ex 模式,它们允许比 vi 兼容的 Ex 模式(vim -E
)更高级的命令。请参阅:Ex 模式和改进型 Ex 模式有何区别?
Ex 是一系列编辑器的根源:edit、ex 和 vi。Ex 是 ed 的超集,最显著的扩展是显示编辑功能。ex (1)
示例 1
127
以下是更改为128
文件hosts
并打印输出的简单示例:
ex -s +%s/127/128/g +%p +q! /etc/hosts
相当于:
sed s/127/128/g /etc/hosts
对于更高级的解决方案,您可以使用 vim 命令文件并通过更经典的方法进行 I/O 重定向:
echo :%s/127/128/g > cmds.vim
echo :%print >> cmds.vim
echo :%quit! >> cmds.vim
ex -s /etc/hosts < cmds.vim # The same as: vim -s cmds.vim /etc/hosts
示例 2
您还可以使用 vim 插件来执行一些任务。
例如下面的一行代码将使用标准插件之一将源代码文件转换为 html:
ex -s '+let g:html_no_progress=1' '+syntax on' '+set ft=c' '+runtime syntax/2html.vim' -cwqa my_code.c
它将根据您的代码(以任何受支持的语言编写)生成可供打印或在您的网站上发布的 html 文件(带有语法高亮显示)。
示例 3
vim -E -s Makefile <<-EOF
:%substitute/CFLAGS = -g$/CFLAGS =-fPIC -DPIC -g/
:%substitute/CFLAGS =$/CFLAGS =-fPIC -DPIC/
:%substitute/ADAFLAGS =$/ADAFLAGS =-fPIC -DPIC/
:update
:quit
EOF
示例 4
以下脚本将通过下载示例站点的 html 并用自动生成的包含随机数的 20x20 表格替换其主体来创建一个新的 html 文件:
" table.vim
%!curl -s example.com
let @t='<table>'.repeat('<tr>'.repeat('<td>_</td>',20).'</tr>',20).'</table>'
/<body
norm!vitd"tP
%s/_/\=system('echo $RANDOM')/g
wq
用法:
ex -s table.html < table.vim
这将在安装了 curl 的 *nix 类系统上运行。添加
-V
以查看脚本的运行情况。
更多示例:
也可以看看:
- 学习 vi 编辑器/Vim/模式:Ex-mode
- Ex 模式有实际用途吗?在 Vim SE
答案2
Ex-Mode 主要用于对多个文件执行相同的操作。
假设您有 25 个 .html 文件,其中包含:
<a href="/home.html"> ...
你不用打开每一个,而是可以使用 Ex-mode 将其全部更改为index.html
:
vim -E -s bob.html <<-EOF
:%substitute/home.html/index.html/
:update
:quit
EOF
答案3
从最近的 7.3 版本开始,作为持久撤消支持,ex 模式和其他形式的 vim 批处理优于其他非 vim 方法,因为它不会破坏撤消历史记录。
添加:如果启用“持久撤消”,则在撤消历史记录中保留对文件的所有更改(最多有限制),跨越 vim 编辑会话。如果文件由外部程序编辑,vim 将在通过校验和检测到文件已更改时重置撤消历史记录。vim -E 将允许您批量编辑文件,并且编辑将保留在撤消历史记录中。
答案4
这并没有回答你关于批处理的问题,但它是解释 Ex 模式的另一种方式。你知道你如何按:
进入命令行模式并输入命令吗?好吧,Ex 模式也允许你输入相同的命令,只是 Vim 在你输入命令后不会离开 Ex 模式,它会停留在 Ex 模式,你可以输入另一个命令。所以它有点像 REPL(读取、求值、打印、循环),但没有打印(所以只是一个 REL……)。稍后我会回到为什么你可能想要那种 REL。这就是为什么它被称为 Ex 模式,它允许你输入 Ex 命令,这与命令行模式的作用相同,它允许你输入 Ex 命令。另一种解释方式是,它允许你输入并立即执行 Vimscript/VimL 代码。Vimscript/VimL 是一种可以用来编写 Vim 插件的语言。它也是你用来编写配置(可能是 .vimrc)文件的语言。它也是你从命令行模式或 Ex 模式输入 Ex 命令时使用的语言。因此从这个角度来看,Ex-mode 可以看作是 VimL REL。你为什么想要 VimL REL?出于同样的原因,人们喜欢其他语言的 REPL。它们对于调试代码或试验语言以了解其工作原理非常有用,特别是当你在 VimL 中编写插件或高度自定义配置文件时(这可能意味着你违反了 SRP 原则,应该将其分解为插件)。