Są to, co prawda, tajemnicze sed
polecenia. W szczególności (z man sed
):
: etykieta
Etykieta dla poleceń b i t.
etykieta t
Jeśli as /// dokonał pomyślnego podstawienia od ostatniego odczytu linii wejściowej i od ostatniego polecenia t lub T, to należy przejść do etykiety; jeśli etykieta zostanie pominięta, przejdź do końca skryptu.
n N Odczytaj / dodaj następny wiersz danych wejściowych do obszaru wzorów.
Tak więc skrypt, który opublikowałeś, można podzielić na (dodane spacje dla czytelności):
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`.
Zasadniczo to, co to robi, można zapisać w pseudokodzie jako
while (not end of line){
append current line to this one and replace \n with 'string'
}
Możesz to zrozumieć nieco lepiej dzięki bardziej złożonemu przykładowi wprowadzania:
$ printf "line1\nline2\nline3\nline4\nline5\n" | sed ':a;$!N;s/\n/string/;ta'
line1stringline2stringline3stringline4stringline5
Nie jestem do końca pewien, dlaczego !$
jest to potrzebne. O ile mogę stwierdzić, możesz uzyskać tę samą moc wyjściową
printf "line1\nline2\nline3\nline4\nline5\n" | sed ':a;N;s/\n/string/;ta'