Це, звичайно ж, загадкові sed
команди. Конкретно (від man sed
):
: мітка
Мітка для команд b і t.
t label
Якщо /// зробила успішну заміну після прочитання останнього рядка введення та з останньої команди 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'