Oto kolejna sed
:
sed -e:n -e'/\n#.*\ndotan/!{$!{N;/^#/bn' \
-eb -e\} -e'/^#/s/\(\n\)\(dotan.*\)*/\1#\2/g' \
-et -e\} -eP\;D <in >out
Tak, jak prosisz. Po prostu działa na stosie - buduje go, gdy jest to konieczne i tak długo, jak to konieczne między wystąpieniami komentowanych linii, i zrzuca stary bufor na korzyść nowej komentowanej linii dalej na wejściu, gdy ją znajdzie. Obrazek...
Przepraszam, nie wiem, dlaczego to zrobiłem. Ale przyszło mi do głowy.
W każdym razie sed
rozkłada swoje bufory między każdą ostatnią komentowaną linią w dowolnej serii, nigdy nie zatrzymując ani jednego więcej w swoim buforze, niż jest to konieczne do dokładnego śledzenia ostatniego komentowanego wystąpienia, a jeśli w dowolnym momencie napotka ostatnią linię podczas tej operacji, spróbuje końcowa g
instrukcja wykonania gałęzi i odgałęzienie t
szacują, że cały bufor zostanie wydrukowany, w przeciwnym razie P
zrzuci wszystkie linie, które zwolni z bufora, gdy tylko to zrobi.
Wydaje mi się, że właśnie to przywodziło na myśl akordeon ...
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
Jest tylko jedna różnica między tym poleceniem a powyższym i jest to l
polecenie ook na górze. Kiedy l
przyglądamy się działającej sed
przestrzeni wzorcowej, możemy lepiej zrozumieć, co dzieje się za kulisami i lepiej zrozumieć, w jaki sposób kierować jej wysiłkami.
W tym przypadku możemy obserwować sed
dane wejściowe stosu, dopóki nie znajdzie drugiego wystąpienia danych \n#.*\ndotan
wejściowych, i kiedy zacznie drukować poprzednią linię na raz. To trochę fajne. Wiele się nauczyłem, pracując nad tym.