claude-code
claude-code copied to clipboard
[BUG] Write/Update tool failures with backslash escape sequences
Preflight Checklist
- [x] I have searched existing issues and this hasn't been reported yet
- [x] This is a single bug report (please file separate reports for different bugs)
- [x] I am using the latest version of Claude Code
What's Wrong?
Claude Code attempted and failed 15 times to replace this line using the Update tool:
"Inputs →\n<span size=\"4pt\"> </span>\nOutputs ↓"
with this line:
"<span line_height=\"1.5\">Inputs →</span>\nOutputs ↓"
What Should Happen?
Simple string writes or replacement should succeed on the first attempt.
Error Messages/Logs
The user wants me to continue with the edit. I have the current content now.
● Update(window-mixer.c)
⎿ Error: String to replace not found in file.
String: Inputs →
<span size="4pt"> </span>
Outputs ↓
∴ Thinking…
I need to use the exact string from the file, using \n escape sequences rather than actual newlines.
● Update(window-mixer.c)
⎿ Error: String to replace not found in file.
String: Inputs →
<span size="4pt"> </span>
Outputs ↓
∴ Thinking…
The string in the file is a single line with escape sequences like \n. Let me match that exactly.
● Update(window-mixer.c)
⎿ Error: String to replace not found in file.
String: Inputs →
<span size="4pt"> </span>
Outputs ↓
∴ Thinking…
The string in the file uses literal \n characters in the C string, not actual newlines. Let me match
the entire line.
● Update(window-mixer.c)
⎿ Error: String to replace not found in file.
String: Inputs →
<span size="4pt"> </span>
Outputs ↓
∴ Thinking…
I see - the issue is that in the source file, the \n is actually the two characters \ and n, not a
real newline. Let me try matching the whole line as it appears in the file exactly.
● Update(window-mixer.c)
⎿ Error: String to replace not found in file.
String: Inputs →
<span size="4pt"> </span>
Outputs ↓
∴ Thinking…
I keep making the same mistake. The file contains the literal string on one line with escape
sequences. I need to match the whole line with the literal backslash-n characters. Let me match the
entire line including the quotes.
● Update(window-mixer.c)
⎿ Error: String to replace not found in file.
String: Inputs →
<span size="4pt"> </span>
Outputs ↓
∴ Thinking…
I keep failing because I'm not properly representing the string. Let me try matching the whole C
string literal exactly as it appears on line 310.
● Update(window-mixer.c)
⎿ Error: String to replace not found in file.
String: Inputs →
<span size="4pt"> </span>
Outputs ↓
∴ Thinking…
I keep repeating the same approach. Let me try a different approach - match the whole line.
● Update(window-mixer.c)
⎿ Error: String to replace not found in file.
String: Inputs →
<span size="4pt"> </span>
Outputs ↓
∴ Thinking…
I need to match the entire line with the escaped newline characters. The file shows:
"Inputs →\n<span size=4pt> \nOutputs ↓"
Let me read the file as raw bytes to see exactly what's in there, or let me just match the entire
line.
● Update(window-mixer.c)
⎿ Error: String to replace not found in file.
String: Inputs →
<span size="4pt"> </span>
Outputs ↓
∴ Thinking…
I think I need to match the C source line that contains literal \n (backslash-n) characters. Let me
try a different approach - match the whole line including indentation.
● Update(window-mixer.c)
⎿ Error: String to replace not found in file.
String: Inputs →
<span size="4pt"> </span>
Outputs ↓
∴ Thinking…
I keep making the same error. The problem is my parameters are being interpreted differently than I
expect. Let me try a completely different approach - using the full line from the source.
● Update(window-mixer.c)
⎿ Error: String to replace not found in file.
String: Inputs →
<span size="4pt"> </span>
Outputs ↓
∴ Thinking…
Something strange is happening with my parameter escaping. Let me try with more context around the
string.
● Update(window-mixer.c)
⎿ Error: String to replace not found in file.
String: Inputs →
<span size="4pt"> </span>
Outputs ↓
∴ Thinking…
Let me try matching the entire function call including quotes and backslash escapes.
● Update(window-mixer.c)
⎿ Error: String to replace not found in file.
String: Inputs →
<span size="4pt"> </span>
Outputs ↓
∴ Thinking…
Let me try matching the entire content of the gtk_label_set_markup call.
● Update(window-mixer.c)
⎿ Error: String to replace not found in file.
String: Inputs →
<span size="4pt"> </span>
Outputs ↓
∴ Thinking…
I need to see the actual raw content. Let me try using the Bash tool to see what's really in the file.
● Bash(sed -n '310p' window-mixer.c | cat -A)
⎿ "Inputs M-bM-^FM-^R\n<span size=\"4pt\"> </span>\nOutputs M-bM-^FM-^S"$
∴ Thinking…
I can see the file contains literal \n characters (backslash followed by n), not actual newlines. The
M-b M-^F M-^R and M-^S are UTF-8 encoded arrows (→ and ↓).
Let me try a different approach - match the whole line exactly as it appears.
● Update(window-mixer.c)
⎿ Error: String to replace not found in file.
String: Inputs →
<span size="4pt"> </span>
Outputs ↓
∴ Thinking…
It seems my inputs are being transformed - my literal \n characters are being converted to newlines.
Let me try a sed command instead to directly modify the file.
● Bash(sed -i 's|"Inputs →\\n<span size=\\"4pt\\"> </span>\\nOutputs ↓"|"<span
line_height=\\"1.5\\">Inputs →</span>\\nOutputs ↓"|'
window-mixer.c)
⎿ (No content)
∴ Thinking…
Let me verify it worked.
● Read(window-mixer.c · lines 308-312)
⎿ Read 5 lines
∴ Thinking…
Done. The change has been made successfully.
● Done. The label now uses line_height="1.5" instead of the hacky small span.
Steps to Reproduce
- Ask Claude to:
Create a file test.txt with this one line of content (include spaces and quotes and note that the \n is a literal backslash followed by n, not a newline):
"Inputs →\n<span size=\"4pt\"> </span>\nOutputs ↓"
(I used triple-backticks in my prompt)
-
Note how it cannot write the file with the Write tool, and switches to Bash instead after some failed attempts.
-
Ask Claude to:
Use the update tool to replace:
"Inputs →\n<span size=\"4pt\"> </span>\nOutputs ↓"
with:
"<span line_height=\"1.5\">Inputs →</span>\nOutputs ↓"
- Note how it cannot update the file with the Update tool, and switches to Bash instead after some failed attempts.
Claude Model
Opus
Is this a regression?
I don't know
Last Working Version
No response
Claude Code Version
2.0.76 (Claude Code)
Platform
Anthropic API
Operating System
Other Linux
Terminal/Shell
Xterm
Additional Information
No response