Это, по общему признанию, загадочные sed
команды. Конкретно (с man sed
):
: label
Метка для команд b и t.
t метка
Если as /// выполнила успешную замену после того, как была прочитана последняя строка ввода и после последней команды t или T, то переход к метке; если метка опущена, переход к концу скрипта.
n N Прочитайте / добавьте следующую строку ввода в пространство шаблона.
Итак, скрипт, который вы разместили, может быть разбит на (пробелы добавлены для удобства чтения):
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`.
По сути, то, что это делает, можно записать в псевдокоде как
while (not end of line){
append current line to this one and replace \n with 'string'
}
Вы можете понять это немного лучше с более сложным примером ввода:
$ printf "line1\nline2\nline3\nline4\nline5\n" | sed ':a;$!N;s/\n/string/;ta'
line1stringline2stringline3stringline4stringline5
Я не совсем уверен, зачем !$
это нужно. Насколько я могу судить, вы можете получить тот же результат с
printf "line1\nline2\nline3\nline4\nline5\n" | sed ':a;N;s/\n/string/;ta'