Devido ao fato de que o github tem sua própria maneira de gerar atributos id = ".." em h1, h2, h3, etc ... cabeçalhos na versão html após o processamento do Markdown (por exemplo, o Bitbucket usa um padrão pouco diferente de lentidão no título dos cabeçalhos para id = "slug") é útil não reinventar a roda e usar a biblioteca que fez a engenharia reversa desse processo.
Encontrei uma biblioteca muito boa para essa tarefa chamada markdown-toc .
Para mim parece a melhor solução porque sempre instalei o node na minha máquina.
Basta executar npx remarcação-toc -i file.md .
E parece que é uma das ferramentas mais populares para essa tarefa - pelo menos no ecossistema node.js.
ls
cat <<EOF >> test.md | tee
## Table of Contents
<!-- toc -->
- old toc 1
- old toc 2
- old toc 3
<!-- tocstop -->
## abc
This is a b c.
## xyz
This is x y z.
EOF
ls
cat test.md
npx markdown-toc -i test.md
cat test.md
resultado: