Dies ist eine tragbare Lösung mit POSIXsed
, die die folgenden Regeln implementiert:
- Leerzeilen werden gestrichen.
- Jede Zeile, die mit beginnt,
#S
wird mit der vorherigen nicht leeren Zeile mit einem einzigen Leerzeichen zwischen ihnen zusammengefügt, es sei denn, es gibt keine vorherige nicht leere Zeile.
Der Code:
<data sed '/^$/ d; :start; N; s/\n$//; t start; s/\n#S/ #S/; t start; P; D'
Dasselbe mit Kommentaren (noch funktionierender Code):
<data sed ' /^$/ d # If empty line read, delete it and start a new cycle. :start # A label. N # Read additional line, there are now two lines in the pattern space. s/\n$// # If the second line is empty, replace the newline with nothing. t start # If the above replacement occurred, go to start (to add another line). # Otherwise s/\n#S/ #S/ # if the second line starts with #S, replace the newline with space. t start # If the above replacement occurred, go to start (to add another line). # Otherwise # (i.e when non-empty line not starting with #S occurred) P # print the pattern space up to the first newline and... D # delete the initial segment of the pattern space # through the first newline (i.e. everything just printed), # and start the next cycle with the resultant pattern space # and without reading any new input # (in our case the new input will be explicitly read by N then). '
Beachten Sie, dass die Lösung sed
Musterbereich verwendet, um viele Eingabezeilen zu akkumulieren. Diese Bemerkung gilt:
Die Muster- und Haltebereiche müssen jeweils mindestens 8192 Bytes enthalten können.
Unmittelbar vor dem P
Befehl enthält der Musterbereich eine (relativ lange) Zeile, die gedruckt werden soll, und eine einzige (relativ kurze) Eingabezeile sowie eine neue Zeile dazwischen. Natürlich hängt es von Ihren Daten ab, ob diese Struktur irgendwann 8192 Bytes überschreitet oder nicht. In diesem Fall schlagen einige sed
Implementierungen möglicherweise fehl.