sublime text 通过 build system 调用 shell 命令(如 sed/awk)处理选中文本,需显式指定 shell、避免路径和环境变量问题、确保命令读取 stdin 并输出 stdout、正确处理 json 转义与 locale 设置。

Sublime Text 本身不执行 awk/sed,它只是编辑器;真正干活的是 shell —— 所以混合处理的关键在于“如何把 Sublime 里的文本安全、可控地送进命令行,再把结果拿回来”。
用 Sublime 的 “Build System” 调用 sed/awk 必须改默认 shell
Sublime 默认 Build System(如 shell)在 macOS/Linux 上可能走 /bin/sh,而 sed -E 或 awk 的某些特性(比如 GNU 扩展)在 /bin/sh 下不可用或行为异常。Windows 上更麻烦,sed 往往来自 Git for Windows 或 MSYS2,路径和环境变量不一致。
- 必须显式指定 shell:在 Build System 中写
"cmd": ["/bin/bash", "-c", "sed -E 's/.../.../'"],不能只写"cmd": ["sed", "-E", "..."] - 避免使用
~路径:Sublime 的工作目录不一定是用户 home,~/.bashrc不会自动 source,环境变量(如PATH)可能不含gawk或gsed - macOS 用户注意:
sed -i ''是 BSD 语法,Linux 的sed -i会报错;统一用sed -i.bak+ 重定向更稳妥
从 Sublime 选中文本 → 传给 awk/sed → 替换当前视图,三步缺一不可
Sublime 没有“管道”概念,所谓“传入”其实是把选区内容作为 stdin 交给外部命令,再捕获 stdout 替换原选区。这要求命令必须是“纯函数式”:输入即输出,不依赖文件路径,不产生 stderr 干扰。
- 错误写法:
awk '{print $1}' file.txt—— 它读文件,不是读 stdin,Sublime 传的文本会被忽略 - 正确写法:
awk '{print $1}'(无文件参数),靠管道或重定向接收 Sublime 输入 - 如果需要上下文(比如前/后几行),不能只传选区——得先用 Sublime 的
Ctrl+Shift+P→ “Select All” 或扩展插件导出整文件,再调用命令 - 中文或 UTF-8 特殊字符要加
LC_ALL=C防止awk报invalid byte sequence,例如:LC_ALL=C awk '{gsub(/ /,"_"); print}'
sed 替换时 & 符号和 引用容易被 Sublime 的 JSON 配置转义吃掉
Build System 是 JSON 格式,而 sed 的 replacement 字符串里常含 &(匹配全文)、(捕获组)、$(行尾)等,这些在 JSON 字符串里要么被 Sublime 解析失败,要么被 shell 二次展开。
-
&在 JSON 里不用转义,但送到 shell 前可能被误认为变量引用 → 改用单引号包裹整个 sed 表达式:"cmd": ["/bin/bash", "-c", "sed 's/pattern/(&)/g'"] -
在 JSON 中必须写成\1(因为 JSON 解析一次,shell 再解析一次) - 正则中的
$行尾锚点,在双引号字符串里会被 shell 当作变量 → 必须用单引号,或写成$ - 调试技巧:先在终端跑通命令,再复制到 Build System,最后把所有
"和按 JSON 规则补全
真正卡住人的从来不是 awk '{print $2}' 这类简单操作,而是当你要把 Sublime 里高亮的某段 JSON 数组、用 awk 提取 key 并按字母序重排、再塞回原位置时,LC_ALL、JSON 转义、stdin 缓冲区大小、以及 Sublime 自身对二进制输出的截断——这些边界条件一个没兜住,结果就莫名消失或乱码。











