İş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, sed
arabelleklerini 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 g
lobal yürütme ifadesi ve şube t
, yazdırılacak tüm arabelleği doldurur , yoksa P
en 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 l
biz 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, sed
girişte ikinci bir oluşum bulunana kadar yığın girişini izleyebiliriz \n#.*\ndotan
ve bir kerede bir önceki satırı yazdırmaya başlar. Çok havalı. Bu konuda çok şey öğrendim.