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, sed
diffonde 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 g
dichiarazione finale di esecuzione lobale e la diramazione di t
tutto il buffer da stampare, altrimenti P
staccherà 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 l
comando ook in alto. Quando abbiamo l
ook 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' sed
input di stack fino a quando non viene rilevata una seconda occorrenza di \n#.*\ndotan
input, e che quando inizia a stampare la precedente una riga alla volta. È un po 'figo. Ho imparato molto lavorando su questo.