How to Remove Markdown Formatting from ChatGPT and Claude Output
AI chat answers arrive full of asterisks, pound signs and link syntax. Why it happens, three ways to get clean text out (and which one fits where you're pasting), and what plain text can't preserve.
You ask an AI assistant for a summary, paste it into an email or a form field, and the result is littered with ** pairs, ## prefixes and [text](https://...) links. Nothing is broken. The assistant wrote Markdown, the chat window rendered it nicely, and your destination simply doesn't speak Markdown.
This post covers why that happens, three ways to get clean text out, and the cases where you should keep some formatting instead of stripping everything.
Why AI output is full of Markdown
Chat assistants are trained and prompted to format answers with Markdown, because the chat interface renders it: bold for emphasis, # for headings, - for lists, backticks for code. What you see in the window is the rendered result. What you often get on your clipboard depends on how you copy:
- A copy button on the message typically copies the underlying Markdown source, asterisks and all. This is exactly what you want when pasting into GitHub or Notion, and exactly what you don't want in an email.
- Selecting rendered text with the mouse usually copies rich text (real bold, real bullets). Destinations that accept rich text, such as Google Docs, Word and most email composers, keep the formatting. Destinations that only accept plain text drop the styling and keep whatever characters came along.
Which one you get varies by product and changes over time, so don't rely on either. The reliable fix is to decide what you want the destination to receive and convert on purpose.
Option 1: Ask for plain text up front
The cheapest fix is a one-line instruction: "Reply in plain text only, no Markdown formatting." Most assistants follow it, and it works well for short answers.
It's less dependable when you've already got a long answer you like, when the model drifts back to Markdown several messages into a conversation, or when you're stripping a document you didn't generate yourself (a README, exported notes, a wiki page). It also costs you a re-run for every answer you've already received.
Option 2: Strip it with a converter
Pasting the Markdown into a converter and copying the clean result is the dependable approach, and it works on any Markdown, not just AI output. Our Markdown to Plain Text tool runs entirely in your browser and parses the text as real Markdown instead of deleting characters blindly, which matters in a few cases:
- Nested formatting.
**bold with _italic_ inside**should become the words, not a half-stripped mess. - Lists. Bullets become
•characters (or are removed, if you prefer), numbered items keep their numbers, and nested items stay indented. - Links. By default you get just the link text. Tick "Keep link URLs" and each link becomes
text (url), which is usually what you want in an email where the reader can't click. - Tables. Markdown tables can't survive in plain text, so each row becomes a line with tab-separated cells. That pastes straight into a spreadsheet.
- Code. Fences and backticks go away; the code text stays (or you can drop code blocks entirely).
Option 3: Do it yourself with a regex (and why it breaks)
A common shortcut is a handful of search-and-replace patterns:
**text** -> text
# Title -> Title
[a](b) -> a
That handles the easy 80%, then fails in predictable ways:
- A literal asterisk in prose (
5 * 3, a footnote star) gets eaten as if it were emphasis. - Underscores inside identifiers (
snake_case_name) get mistaken for italics. - Nested emphasis and links inside list items need ordering tricks that are easy to get wrong.
- Code blocks should be exempt from every rule, but a naive pass strips inside them too.
If you only strip occasionally, a parser-based tool saves the debugging. If you're scripting it, use a real Markdown parser and walk its output rather than layering patterns.
When you should not strip everything
Plain text deletes meaning along with the markup. Before stripping, check whether the destination actually has a better option:
| Destination | Better approach |
|---|---|
| Slack | Convert to Slack's own syntax with the Markdown to Slack tool. Bold and links survive. See our Slack formatting guide. |
| Word or Google Docs | Convert to a real document with Markdown to Word, keeping headings and tables. |
| Email newsletter | Produce inline-styled HTML with Markdown to Email HTML. See the email HTML guide. |
| Notion, Jira, Confluence | These have their own import paths; see Notion and Jira. |
| Plain-text field, SMS, form, CMS that shows raw text | Strip it. This is the right case for the plain text tool. |
What gets lost
Be aware of what plain text cannot carry: emphasis (bold and italic are gone by definition), heading hierarchy (a heading becomes an ordinary line, so add your own spacing or capitalization if the structure matters), and anything that needed rendering, such as Mermaid diagrams, math and footnotes. Those pass through as their source text. If your content leans on them, see how footnotes and diagrams behave across platforms.
Quick checklist
- Know where the text is going. Rich-text target: copy rendered text. Markdown-aware target: paste the source. Plain-text-only target: strip.
- For one-off answers, ask the assistant for plain text first.
- For everything else, run it through a parser-based converter and decide on link URLs and bullets.
- Skim the output once. Stripped lists and tables are the places most likely to need a manual touch.