Eccone un altro sed:
sed -e:n -e'/\n#.*\ndotan/!{$!{N;/^#/bn' \
-eb -e\} -e'/^#/s/\(\n\)\(dotan.*\)*/\1#\2/g' \
-et -e\} -eP\;D <in >out
Questo fa come chiedi. Funziona solo su uno stack - costruendolo quando necessario e per tutto il tempo necessario tra le occorrenze delle righe commentate e scaricando il vecchio buffer a favore della nuova riga commentata più avanti nell'input quando ne trova una. Immagine...

Scusa, non so perché l'ho fatto. Ma mi è venuto in mente.
Ad ogni modo, seddiffonde i suoi buffer tra ogni ultima riga commentata di qualsiasi serie, non mantenendo mai un singolo più nel suo buffer di quanto sia necessario per tracciare con precisione l'ultima occorrenza commentata, e se in qualsiasi momento incontra l'ultima riga mentre lo fa, tenterà il la gdichiarazione finale di esecuzione lobale e la diramazione di ttutto il buffer da stampare, altrimenti Pstaccherà tutte le righe che rilascia dal suo buffer non appena lo fa.
Immagino sia questo che ha fatto venire in mente le fisarmoniche ...
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
C'è solo una differenza tra questo comando e quello sopra e quello è il lcomando ook in alto. Quando abbiamo look a sed's spazio modello come funziona possiamo ottenere una migliore idea di quello che succede dietro le quinte e una migliore comprensione di come indirizzare i propri sforzi.
In questo caso possiamo osservare l' sedinput di stack fino a quando non viene rilevata una seconda occorrenza di \n#.*\ndotaninput, e che quando inizia a stampare la precedente una riga alla volta. È un po 'figo. Ho imparato molto lavorando su questo.