İşte bir başkası sed:
sed -e:n -e'/\n#.*\ndotan/!{$!{N;/^#/bn' \
-eb -e\} -e'/^#/s/\(\n\)\(dotan.*\)*/\1#\2/g' \
-et -e\} -eP\;D <in >out
İstediğiniz gibi yapar. Sadece bir yığın üzerinde çalışır - gerektiğinde ve yorumlanmış satırların oluşumları arasında gerektiği kadar bina ve eski arabelleği yeni yorumlanmış satır lehine bir tane bulduğunda girdi olarak daha da boşaltır. Resim...

Üzgünüm, bunu neden yaptığımı bilmiyorum. Ama aklıma geldi.
Her neyse, sedarabelleklerini herhangi bir dizideki son yorumlanan her satır arasına yayar, hiçbir zaman arabellekte son yorumlanan olayı doğru bir şekilde izlemek için gerekenden daha fazla tutmaz ve bunu yaparken herhangi bir zamanda son satırla karşılaşırsa, son global yürütme ifadesi ve şube t, yazdırılacak tüm arabelleği doldurur , yoksa Pen kısa sürede arabelleğinden serbest bıraktığı tüm satırları dizginler .
Akordeonları akla getiren şey bu ...
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
Bu komut ile yukarıdaki komut arasında tek bir fark vardır ve bu lüstteki ook komutudur. Biz ne zaman lbiz Ook sedçalıştığını olarak 'nın desen alanı biz perde arkasında neler olup bittiğine dair daha iyi bir fikir ve çabalarını yönlendirmek için nasıl daha iyi anlamak alabilirsiniz.
Bu durumda, sedgirişte ikinci bir oluşum bulunana kadar yığın girişini izleyebiliriz \n#.*\ndotanve bir kerede bir önceki satırı yazdırmaya başlar. Çok havalı. Bu konuda çok şey öğrendim.