Hier ist eine andere sed
:
sed -e:n -e'/\n#.*\ndotan/!{$!{N;/^#/bn' \
-eb -e\} -e'/^#/s/\(\n\)\(dotan.*\)*/\1#\2/g' \
-et -e\} -eP\;D <in >out
Das macht was du fragst. Es funktioniert nur auf einem Stapel - es wird bei Bedarf und so lange wie nötig zwischen den Vorkommen kommentierter Zeilen aufgebaut und der alte Puffer zugunsten der neuen kommentierten Zeile weiter in der Eingabe ausgegeben, wenn er eine findet. Bild...
Entschuldigung, ich weiß nicht warum ich das getan habe. Aber es kam mir in den Sinn.
Auf sed
jeden Fall werden die Puffer zwischen den zuletzt kommentierten Zeilen einer Reihe verteilt, und es wird nie mehr in den Puffer geschrieben, als zur genauen Verfolgung des zuletzt kommentierten Ereignisses erforderlich ist. Stößt das Programm dabei zu irgendeinem Zeitpunkt auf die letzte Zeile, versucht es dies endgültige g
lobaler Ausführung Anweisung und Zweig t
est puffern die ganze gedruckt werden aus, sonst wird es P
all diese Linien RINT es aus seinem Puffer freigibt , sobald es tut.
Ich denke, das hat die Akkordeons in den Sinn gebracht ...
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
Es gibt nur einen Unterschied zwischen diesem und dem obigen Befehl und das ist der l
Befehl ook oben. Wenn wir uns den Pattern Space l
anschauen sed
, wie er funktioniert, können wir eine bessere Vorstellung davon bekommen, was sich hinter den Kulissen abspielt, und ein besseres Verständnis dafür, wie man seine Bemühungen lenkt.
In diesem Fall können wir die sed
Stapeleingabe beobachten , bis ein zweites Vorkommen der \n#.*\ndotan
Eingabe gefunden wurde, und zwar dann, wenn der Ausdruck der vorherigen Zeile zu einem Zeitpunkt beginnt. Es ist irgendwie cool. Daran habe ich viel gelernt.