Claudeのedit_fileができない原因と解決策|exact matchエラーの正体と回避法
# Claudeのedit_fileができない原因と解決策|exact matchエラーの正体と回避法
結論:edit_file失敗の原因は「一致条件が厳密すぎること」
ClaudeのMCPツール edit_file を使っていて、こんなエラーに出くわしたことはありませんか?
特にWSL環境では、このエラーが起きやすいです。 改行コードの混在(CRLF vs LF)がexact matchの不一致を引き起こすためです。
Could not find exact match for oldText in fileこのエラーが出る原因はシンプルです。`edit_file` は、`oldText` に指定した文字列がファイル内に「完全一致」で存在しないと動かないからです。スペース1つ、改行コード1文字、JSONのエスケープの有無——そのどれかが少しでも違うと、ファイルを変更する前に処理が止まります。
設定ミスでも、Claudeのバグでもありません。仕様として「厳密な一致」を要求しているツールなので、一致しない理由を1つずつ潰していくことが解決への近道です。この記事では、私が実際に詰まったケースをもとに、よくある原因5つと即効の対処法をまとめます。
WSL環境でedit_fileが失敗しやすい理由
WSLを使っている方には、このエラーが特に起きやすいです。なぜWSL環境が鬼門になるのかを、まとめて整理しておきます。
改行コードの混在(CRLF vs LF)
WSL環境では、ファイルがWindowsとLinuxの両方から触られることがあります。Windowsのエクスプローラーでファイルを開いてメモ帳で保存すると、改行コードが CRLF(\r\n)に変換されます。Linux側では LF(\n)が標準です。
Claudeが oldText を LF ベースで生成していても、ファイルが CRLF になっていると1バイト単位の完全一致が取れず、即座にエラーになります。
確認と対処:VSCodeの右下に「CRLF」と表示されていたら、クリックして「LF」に変換してから再試行してください。
/mnt/c上のファイル操作が絡む場合
/mnt/c/ 上のファイルを edit_file で修正しようとすると、ファイルシステム間のI/O変換が加わり、文字コードやメタデータの扱いがさらに複雑になります。WSL環境でのファイル操作全般の遅さ・トラブルについては「WSLで/mnt/cが遅い理由と解決策」で詳しく解説しています。
/mnt/c/ 上のファイルを edit_file で修正する必要がある場合は、まず ~/ に移動してから作業することをおすすめします。
Claude edit_fileができない原因
「edit_fileって、単純にテキストを置き換えるだけじゃないの?」と最初は思っていました。ところが実際に使ってみると、思いのほか繊細なツールだということがわかります。
exact matchとは何か
edit_file は内部で、指定した oldText をファイルの内容から1バイト単位で探します。ファイル内に該当する文字列が見つかった場合のみ、その箇所を newText で置き換えます。
つまり「だいたい似ている」では動きません。Claudeがコンテキストから oldText を生成するとき、元のファイルと完全に一致していない文字列を渡すと、即座にエラーになります。
なぜ失敗するのか
問題は、Claudeがコンテキストウィンドウにロードしたファイルの内容と、ディスク上の実際のファイルの内容がずれていることがあるからです。具体的な原因は後述しますが、このズレが「見た目は同じなのにマッチしない」という状況を生み出します。
ファイルを更新したのに再読込していない、エディタが自動フォーマットした、改行コードが変換された——こうした「変化」が、Claudeの持っているテキストと実ファイルの間に差異を作ります。
よくある原因5つ
実際に詰まったケースと、私が調べて把握した原因を5つにまとめます。どれか1つでも心当たりがあれば、そこから確認してみてください。
原因① 改行コードの違い(CRLF vs LF)
Windowsで作成・編集したファイルは改行コードが CRLF(\r\n)になっていることがあります。LinuxやMacでは LF(\n)が標準です。
WSLを使っている場合、Windowsのエクスプローラーでファイルを開いてメモ帳で保存すると、改行コードが CRLF に変換されることがあります。Claudeが oldText を LF ベースで生成していると、ファイル内の CRLF と一致せず、エラーになります。
確認方法:VSCodeの右下に「CRLF」と表示されていたら要注意です。
原因② JSONエスケープの有無
body.md のような素のMarkdownファイルではなく、JSONファイルを直接 edit_file で編集しようとした場合に起きやすいパターンです。
たとえばJSON内にダブルクォートを含む文字列がある場合、ファイル上は \" とエスケープされています。しかしClaudeがコンテキストとして読み込んだとき、" として解釈して oldText に渡すことがあります。この場合、ファイル上の \" と一致せずエラーになります。
対策:JSONファイルはなるべく edit_file で直接触らない。変更が必要なら write_file で全文書き換えるか、JSONの中身を別ファイル(Markdownなど)に分離する設計にする方が安全です。
原因③ ファイル更新後の再読込漏れ
Claudeがファイルを読み込んだ後、そのファイルが別の操作で更新されたとき、Claudeのコンテキストには古い内容が残ったままになります。
write_file でファイルを上書きした直後に edit_file を呼ぼうとすると、Claudeが持っている内容と実ファイルの内容がずれていてエラーになることがあります。`edit_file` の前には必ず最新の状態を読み込み直すことが基本です。
原因④ 複数箇所への一致
oldText に指定した文字列が、ファイル内に2か所以上存在する場合もエラーになります。edit_file はどちらを書き換えるべきか判断できないため、処理を止めます。
よくあるのは、テンプレートを使い回した記事ファイルに同じ表現が複数登場しているケースです。この場合は oldText の範囲を広げて、前後の文脈を含めた一意な文字列に変更する必要があります。
原因⑤ エディタのformat on saveによる自動変換
VSCodeの「Format On Save」が有効になっていると、ファイルを保存するたびにフォーマッターが走ります。インデントの変換、末尾スペースの削除、空行の追加・削除——こういった変更がClaudeの持っているテキストとのズレを引き起こします。
特に Prettier が有効な場合、Markdownファイルの改行やリストの形式も自動で整形されることがあります。Claudeが読み込んだ内容とフォーマット後の内容が違えば、そのまま edit_file に渡してもエラーになります。
実際に詰まったログ
私が実際にこのエラーで詰まったのは、body.md の一部を修正しようとしたときでした。
エラー内容
Could not find exact match for oldText in file
The file content may have changed since it was last read.
Please re-read the file and try again.このエラーメッセージ自体は「ファイル内容が変わっているかもしれないので再読込してください」という意味で、ある意味正直なエラーです。しかしそのときの私は、ファイルを変更した覚えがなかったので最初は意味がわかりませんでした。
どこでハマったか
状況を整理するとこうです。
write_fileでbody.mdを新規作成した- 内容を確認して「この段落を少し修正したい」と思い、そのまま
edit_fileを呼んだ - エラーが出た
原因は、`write_file` の直後に `edit_file` を呼んだことでした。write_file でファイルを書き込んだ時点で、Claudeのコンテキスト上の内容と実ファイルの内容はほぼ同じはずです。しかしClaudeがその後 edit_file に渡した oldText は、生成した本文の一部をそのまま切り取ったものでした。
このとき問題だったのが、本文中に含まれていた日本語の句読点の前後の空白処理と、コードブロックのインデントです。write_file でファイルに書き込まれた実際の内容と、Claudeがコンテキストとして保持していたテキストの表現が微妙に違っていたため、一致しなかったのだと思います。
解決したのは、一度 `read_file` でファイルを再読込してから、再度 `edit_file` を呼んだときです。再読込後は問題なく一致しました。所要時間としては、最初のエラーから解決まで30分ほど試行錯誤しました。正直、原因がわかるまでは「Claudeのバグかな」と思って困りました。
解決方法
エラーが出たときに試す順番を決めておくと、試行錯誤の時間を短縮できます。私が使っている順番を紹介します。
解決策① まずファイルを再読込する
ほとんどのケースはこれで解決します。edit_file の前に read_file(または read_text_file)でファイルを読み込み直してから、もう一度 edit_file を試してください。
Claudeへの指示としては「ファイルを再読込してから修正してください」と伝えるだけで対応してくれます。
解決策② oldTextの範囲を広げる・狭める
一致しない場合、oldText に含める文字列の範囲を変えることで解決することがあります。
- 範囲が広すぎる場合:複数の段落をまたいで
oldTextを指定すると、途中の改行コードや空白の違いが影響しやすくなります。できるだけ短い・一意な範囲に絞ります。 - 範囲が狭すぎる場合:指定した文字列がファイル内に複数存在していてエラーになっているケースです。前後の文脈を含めて一意に特定できる範囲に広げます。
解決策③ format on saveを一時的に無効化する
VSCodeのformat on saveが原因の場合は、settings.json で一時的に無効化します。
{
"editor.formatOnSave": false
}Claudeで自動化作業をしている間はこの設定をオフにしておき、作業が終わったら戻す運用が現実的です。または、対象ファイルの言語モード(Markdown、JSONなど)に対してのみ無効化する方法もあります。
{
"[markdown]": {
"editor.formatOnSave": false
}
}再発防止
一度解決しても、同じエラーに繰り返し引っかかることがあります。私が対策として取り入れた設計の考え方を2つ紹介します。
body.mdへの分離でJSONエスケープ問題を根絶する
JSONファイルに本文を直接書く設計にしていると、エスケープの問題が常についてまわります。私がbizinets.lifeの記事管理で採用している方法は、本文をbody.mdとして分離することです。
article.json にはメタデータ(title・slug・seoDescriptionなど)だけを入れ、本文は body.md に書きます。こうすることで、edit_file で本文を修正するときもMarkdownの素のテキストを扱うだけになり、JSONエスケープが絡む問題が発生しません。
1回の操作で差分を小さくする
edit_file は差分が小さいほど一致しやすくなります。「この関数をまるごと書き換えて」のような大きな変更よりも、「この1行の〇〇を〇〇に変えて」という粒度の小さい指示の方が成功率は上がります。
判断基準としてはこうです。
- 変更範囲が10行を超える →
write_fileで全文書き換えを検討する - 変更箇所が1〜3行程度 →
edit_fileで差分指定する - 同じファイルへの変更が連続する → 必ず
read_fileを間に挟む
この基準を持っておくだけで、エラーに遭遇する頻度はかなり下がると思います。
よくある質問
Q: edit_fileとwrite_fileはどう使い分ければいいですか?
変更範囲が小さい(1〜5行程度)かつ、ファイル全体のほかの部分を保持したい場合は edit_file が適しています。一方、ファイルをほぼ全面的に書き直す場合や、edit_fileで繰り返しエラーが出る場合は write_file で全文上書きする方が確実です。write_file はエラーが出にくい分、意図しない上書きに注意が必要です。
Q: 再読込してもエラーが続く場合はどうすればいいですか?
改行コードの問題が疑われます。VSCodeの右下で改行コードを確認し、CRLFになっていたらLFに変換してから再試行してください。またWSL環境の場合、/mnt/c/ 上のファイルは特に改行コードが混在しやすいため、ファイル自体を ~/ 以下に移動することも検討してみてください。
関連するトラブルとまとめ
WSL環境と edit_file・JSON操作は、互いに影響し合うトラブルが多いです。以下の記事もあわせて確認しておくと、同じ場面で詰まる時間を大幅に減らせると思います。
- [WSLで/mnt/cが遅い理由と解決策](/wsl-mnt-c-slow-reason):改行コード混在の根本原因でもある「/mnt/cのファイルシステム問題」を解説しています
- [JSONで改行がそのまま書けない理由](/json-newline-escape-why):
edit_fileでJSONを直接触るときに起きるエスケープ問題を構造から説明しています - [node_modulesのLinux/Windows混在エラーと解決策](/node-modules-linux-windows-conflict):WSL環境特有のバイナリ不一致問題をまとめています。
edit_fileエラーと同根の改行コード混在が背景にあります
まとめ
edit_file で詰まったとき、同じ経験をした方には伝わると思いますが、原因がわかるまでは「何が悪いのかわからない」状態が続くのが地味につらいです。
解決の基本ステップは3つです。まず `read_file` で再読込する。それでも駄目なら `oldText` の範囲を調整する。それでも解決しなければ `write_file` で全文書き換えに切り替える。この順番を決めておくだけで、試行錯誤の時間が大幅に短縮できます。
今日できる一歩は、VSCodeのformat on saveの設定を確認することです。有効になっていたら、Claude作業中だけでも無効にしてみてください。
edit_fileで詰まる根本には、AIに渡す操作の粒度設計がうまくできていないことがあります。何をどこまでAIに任せるかの判断基準を整理したい方は、bizinets.bizの判断軸ページが参考になると思います。
bizinets.biz
記事を読んで「もっと知りたい」と思ったあなたへ
bizinets.biz では、ビジネスの仕組みづくりを体系的に学べるコンテンツを用意しています。まずは一度、覗いてみてください。
bizinets.biz へ行く →