Whitewolf_Fox schrieb:
Ich verstehe aber leider auch die noch nicht ganz:
Was bedeutet das etwas "in den pattern space" gepackt wird?
sed verarbeitet den Stream normalerweise zeilenweise (und die Newline-Zeichen werden daher nicht beim matchen/bearbeiten berücksichtigt) - den pattern space kannst du dir als einen String-Buffer vorstellen, auf den Befehle angewendet werden können (vgl. sed Dokumentation, die du mit
info sed
aufrufen kannst).
3.1 How `sed' Works
===================
`sed' maintains two data buffers: the active _pattern_ space, and the
auxiliary _hold_ space. Both are initially empty.
`sed' operates by performing the following cycle on each line of
input: first, `sed' reads one line from the input stream, removes any
trailing newline, and places it in the pattern space. Then commands
are executed; each command can have an address associated to it:
addresses are a kind of condition code, and a command is only executed
if the condition is verified before the command is to be executed.
[...]
Um in diesem speziellen Fall mit sed Zeilenenden entfernen zu können, wird der N Befehl genutzt, der die aktuelle und die folgende Zeile durch ein Newline getrennt zusammenführt:
`N'
Add a newline to the pattern space, then append the next line of
input to the pattern space. If there is no more input then `sed'
exits without processing any more commands.
Was bewirkt der Sprung zur "join"-Marke - soweit ich das verstehe würde das eine Endlos-Schleife erzeugen (was ja nicht der Fall ist).
Der Sprung zurück ist notwendig, damit alle Zeilen mit Komma, Slash bzw. nur einem Slash am Ende alle zusammengefügt werden können.
Stell dir vor, du findest eine Zeile, die mit einem Backslash endet, fügst die nachfolgende Zeile an und löscht das Newline-Zeichen. Jetzt würde als nächstes die nächste Zeile ausgewählt werden - was ein Problem verursacht, wenn die Zeile, die du gerade angefügt hast, ebenfalls mit einem Backslash endet. Deswegen springst du in dem Fall effektiv eine Zeile zurück, prüfst erneut, ob sie mit einem Backslash endet, führst falls nötig die Ersetzung durch und wiederholst das so lange, bis alle nötigen Ersetzungen vorgenommen wurden - und wenn er nichts findet, springt er ja nicht zurück zum Label.
Edit: Das war Quatsch, der Sprung zum Label ist wie ein GOTO für das sed-Skript, d.h. er springt nicht eine Zeile zurück, sondern wendet die Befehle erneut auf den ganzen Stream an.
Zu Zeile 9: Ersetze durch einen einzelnen Whitespace, oder?
Ja, klassischer C&Paste Fehler, die beiden sed-Aufrufe sind ja sehr ähnlich 😳