Questi sono, certamente, criptici, sed
comandi. In particolare (da man sed
):
: etichetta
Etichetta per i comandi b e t.
t label
Se as /// ha eseguito correttamente una sostituzione dall'ultima riga di input e dall'ultimo comando t o T, quindi passare all'etichetta; se l'etichetta viene omessa, dalla fine alla fine dello script.
n N Leggi / aggiungi la riga successiva di input nello spazio modello.
Quindi, lo script che hai pubblicato può essere suddiviso in (spazi aggiunti per la leggibilità):
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`.
Fondamentalmente, ciò che sta facendo potrebbe essere scritto in pseudocodice come
while (not end of line){
append current line to this one and replace \n with 'string'
}
Puoi capirlo un po 'meglio con un esempio di input più complesso:
$ printf "line1\nline2\nline3\nline4\nline5\n" | sed ':a;$!N;s/\n/string/;ta'
line1stringline2stringline3stringline4stringline5
Non sono davvero sicuro del motivo per cui !$
è necessario. Per quanto ne so, puoi ottenere lo stesso output con
printf "line1\nline2\nline3\nline4\nline5\n" | sed ':a;N;s/\n/string/;ta'