Dies sind die zugegebenermaßen kryptischen sed
Befehle. Speziell (von man sed
):
: label
Label für b- und t-Befehle.
t label
Wenn as /// seit dem Lesen der letzten Eingabezeile und seit dem letzten t- oder T-Befehl erfolgreich ersetzt wurde, dann verzweige nach label. Wenn die Bezeichnung weggelassen wird, verzweigen Sie zum Ende des Skripts.
n N Lesen / Anhängen der nächsten Eingabezeile in den Musterbereich.
Das von Ihnen veröffentlichte Skript kann also unterteilt werden (Leerzeichen zur besseren Lesbarkeit hinzugefügt):
sed ':a; $!N; s/\n/string/; ta'
--- ---- ------------- --
| | | |--> go back (`t`) to `a`
| | |-------------> substitute newlines with `string`
| |----------------------> If this is not the last line (`$!`), append the
| next line to the pattern space.
|----------------------------> Create the label `a`.
Grundsätzlich könnte das, was dies tut, im Pseudocode als geschrieben werden
while (not end of line){
append current line to this one and replace \n with 'string'
}
Sie können dies anhand eines komplexeren Eingabebeispiels etwas besser verstehen:
$ printf "line1\nline2\nline3\nline4\nline5\n" | sed ':a;$!N;s/\n/string/;ta'
line1stringline2stringline3stringline4stringline5
Ich bin mir nicht sicher, warum das !$
gebraucht wird. Soweit ich das beurteilen kann, können Sie mit dieselbe Ausgabe erzielen
printf "line1\nline2\nline3\nline4\nline5\n" | sed ':a;N;s/\n/string/;ta'