Aqui está outro sed:
sed -e:n -e'/\n#.*\ndotan/!{$!{N;/^#/bn' \
-eb -e\} -e'/^#/s/\(\n\)\(dotan.*\)*/\1#\2/g' \
-et -e\} -eP\;D <in >out
Isso faz o que você pede. Ele simplesmente funciona em uma pilha - construindo-a quando necessário e pelo tempo necessário entre ocorrências de linhas comentadas e descartando o buffer antigo em favor da nova linha comentada mais adiante na entrada quando encontrar uma. Cenário...

Desculpe, não sei por que fiz isso. Mas isso veio à mente.
De qualquer forma, sedespalha seus buffers entre cada última linha comentada de qualquer série, nunca retendo um único mais em seu buffer do que o necessário para rastrear com precisão a última ocorrência comentada e, a qualquer momento, encontra a última linha ao fazê-lo. A ginstrução final de execução tglobal e a ramificação são o buffer inteiro a ser impresso, caso contrário, ele criará Ptodas as linhas que liberar do buffer assim que o fizer.
Acho que foi isso que trouxe os acordeões à mente ...
printf %s\\n \#alice \#bob charlie dotan eric \
\#alice \#bob charlie dotan eric \
\#alice \#bob charlie dotan eric |
sed -e:n -e'l;/\n#.*\ndotan/!{$!{N;/^#/bn' \
-eb -e\} -e'/^#/s/\(\n\)\(dotan.*\)*/\1#\2/g' \
-et -e\} -eP\;D
#alice
#alice\n#bob$
#alice\n#bob\ncharlie$
#alice\n#bob\ncharlie\ndotan$
#alice
#bob\ncharlie\ndotan$
#bob\ncharlie\ndotan\neric$
#bob\ncharlie\ndotan\neric\n#alice$
#bob\ncharlie\ndotan\neric\n#alice\n#bob$
#bob\ncharlie\ndotan\neric\n#alice\n#bob\ncharlie$
#bob\ncharlie\ndotan\neric\n#alice\n#bob\ncharlie\ndotan$
#bob
charlie\ndotan\neric\n#alice\n#bob\ncharlie\ndotan$
charlie
dotan\neric\n#alice\n#bob\ncharlie\ndotan$
dotan
eric\n#alice\n#bob\ncharlie\ndotan$
eric
#alice\n#bob\ncharlie\ndotan$
#alice
#bob\ncharlie\ndotan$
#bob\ncharlie\ndotan\neric$
#bob\ncharlie\ndotan\neric\n#alice$
#bob\ncharlie\ndotan\neric\n#alice\n#bob$
#bob\ncharlie\ndotan\neric\n#alice\n#bob\ncharlie$
#bob\ncharlie\ndotan\neric\n#alice\n#bob\ncharlie\ndotan$
#bob
charlie\ndotan\neric\n#alice\n#bob\ncharlie\ndotan$
charlie
dotan\neric\n#alice\n#bob\ncharlie\ndotan$
dotan
eric\n#alice\n#bob\ncharlie\ndotan$
eric
#alice\n#bob\ncharlie\ndotan$
#alice
#bob\ncharlie\ndotan$
#bob\ncharlie\ndotan\neric$
#bob
#charlie
#dotan
eric
Há apenas uma diferença entre este comando e o acima e esse é o lcomando ook no topo. Quando nós look em sed's espaço de padrões como ele funciona, podemos ter uma melhor idéia do que se passa nos bastidores e uma melhor compreensão de como direcionar seus esforços.
Nesse caso, podemos observar a sedentrada da pilha até encontrar uma segunda ocorrência de \n#.*\ndotanentrada, e quando ela começa a imprimir a linha anterior por vez. É meio legal. Eu aprendi muito trabalhando nisso.