最简洁可靠的方式是用 vim -e -s 配合标准输入传入 ex 命令,全程不启动 ui;需显式写 wq 保存退出,推荐优先使用更轻量且 posix 兼容的 ex -s 命令。

在非交互式 Shell 脚本中用 Vim 修改文件,核心是使用 vim -e(进入 Ex 模式)或更常用的 vim -s + 脚本,但最简洁可靠的方式是:用 vim -e -s 配合标准输入传入 Ex 命令,全程不启动 UI,适合自动化。
用 vim -e -s 批量执行 Ex 命令
-e 启动 Ex 模式(命令行模式),-s 抑制所有提示和消息(静默模式),再通过 stdin 传入命令。注意:必须显式写 wq(保存并退出),否则会卡住。
示例:将文件中所有 foo 替换为 bar:
vim -e -s file.txt
处理多行、带特殊字符的替换
Ex 命令中的分隔符可自定义(避免与内容冲突),比如用 # 或 @;若替换内容含斜杠、单引号等,推荐用 \%s 或换分隔符。
- 用
@分隔:%s@/usr/bin@/opt/bin@g - 插入含单引号的行:
/$pattern/a<cr>new line with 'quote'<cr>.<cr></cr></cr></cr>(a进入追加,.结束输入) - 删除空行:
g/^$/d
安全写法:避免意外失败
脚本中应检查文件是否存在、是否可写,并捕获错误。Vim 在 Ex 模式下出错(如文件只读)会返回非零状态码,可用 $? 判断。
- 加
-n禁用交换文件(避免残留.swp) - 加
+命令可跳过某些初始化(如+set nobackup nowritebackup) - 完整健壮写法:
if [ -w "file.txt" ]; then
vim -e -s -n -i NONE file.txt &2
exit 1
fi
else
echo "file not writable" >&2
exit 1
fi
替代方案:用 ex 命令(更轻量)
实际上 ex 就是 vim -e 的符号链接,行为完全一致,且语义更清晰:
ex -s file.txt
ex 是 POSIX 标准工具,在最小化环境(如容器)中更可能预装,推荐优先使用。











