为什么需要专门的改文件工具

让 AI 改文件,最怕两件事:

  1. 误伤:一次性重写整文件,把别人刚改的那几行冲掉。
  2. 不可预期:不知道它到底改了哪、和原文件差多少。

OpenClaw 内置两套原文件编辑工具,正好解决这个问题:

工具 适用场景 核心机制
apply_patch 新建/大改/多文件批量补丁 标准 diff 补丁格式,原子化写入
edit 已有文件里精准替换几处 oldTextnewText 精确匹配

两者都不要求 AI 把整文件内容重新默写一遍,改动范围清晰、可 diff、可回滚。

apply_patch:用补丁格式改文件

apply_patch 接受标准补丁块,开头结尾固定为 *** Begin Patch / *** End Patch

新建一个文件示例:

*** Begin Patch
*** Add File: scripts/hello.sh
+#!/bin/bash
+echo "hello openclaw"
*** End Patch

修改已有文件里的一段(删除一行用 -,新增用 +,上下文保留原样):

*** Begin Patch
*** Update File: scripts/hello.sh
@@
 #!/bin/bash
-echo "hello openclaw"
+echo "hello from $(date)"
*** End Patch

要点:

  • 路径相对工作区根目录,写相对路径即可,不要用绝对路径硬凑。
  • 补丁是原子的:要么整块写入成功,要么不写,不会出现"写一半"的半截文件。
  • 多文件可以塞进同一个 *** Begin Patch / *** End Patch 块里,一次提交多个改动。

edit:精准替换几处文本

当只想改某几行、且原文明确存在时,edit 比补丁更直观。它靠 oldText 精确匹配:

{
  "path": "config/app.json",
  "edits": [
    { "oldText": "\"port\": 8080", "newText": "\"port\": 9090" },
    { "oldText": "\"debug\": false", "newText": "\"debug\": true" }
  ]
}

约束与技巧:

  • oldText 必须唯一且完全匹配(含空格、缩进),否则工具会拒绝执行——这其实是好事,强制 AI 对齐真实内容。
  • 一次调用可以传多个 edits,它们按顺序、互不重叠地应用。
  • 改完文件,建议立刻用 read 回看改动落点,确认没替错地方。

实战:给现有脚本加一行日志而不重写

假设 scripts/run.sh 原本长这样(节选):

#!/bin/bash
set -e
python3 main.py

edit 精准插一行,而不是把整个文件重新写一遍:

path: scripts/run.sh
edits:
  - oldText: |-
      set -e
      python3 main.py
    newText: |-
      set -e
      echo "[$(date)] run.sh started" >> run.log
      python3 main.py

这样原文件其余内容原封不动,git diff 里只多了一行,review 成本极低。

什么时候用哪个

  • 一个文件里几处明确文本edit(最省事,匹配失败会报错不瞎改)。
  • 新建文件、或一次改多个文件/大面积增删apply_patch(补丁语义清晰、原子)。
  • 纯新增内容、从零写 → 直接 write 也行,但 apply_patchAdd File 同样好用且能和别的改动合并。

一个容易踩的坑

editoldText 区分大小写和空白。从 read 出来的内容直接复制最稳,别手打,否则报"找不到匹配"然后 AI 退而求其次整文件重写——又回到误伤风险。

另外,改完生产配置文件(nginx、crontab、systemd unit),先 exec 跑一次语法校验再 reload,不要改完直接重启。OpenClaw 的 exec 工具配合这两个编辑工具,能形成"改文件 → 校验 → 生效"的闭环。

小结

  • apply_patch 适合补丁式、多文件、原子化改动。
  • edit 适合精准替换,靠唯一匹配防止误改。
  • 二者都避免"整文件重写",让 AI 的每一次改动都可 diff、可回滚、可 review

把这两招用熟,AI 帮你维护代码和配置时,你就能把心放回到肚子里。


扫码关注公众号,获取更多 OpenClaw 实操技巧:

公众号二维码