:a
это метка. $
в адресе означает последнюю строку, d
означает delete . N
обозначает и добавляет следующую строку в пространство шаблона . 2,10
означает строки от 2 до 10, b
означает ответвление (то есть goto ), P
печатает первую строку из пространства шаблона, D
похоже на d
но работает на пространстве шаблона, если это возможно.
Другими словами, вы создаете скользящее окно размером 10. Каждая строка сохраняется в нем, и как только у него есть 10 строк, строки начинают печататься сверху. Каждый раз, когда строка печатается, текущая строка сохраняется в скользящем окне внизу. Когда печатается последняя строка, скользящее окно удаляется, что удаляет последние 10 строк.
Вы можете изменить команды, чтобы увидеть, что удаляется (()
), сохраняется (<>
) и печатается с помощью P
([]
):
$ printf '%s\n' {1..20} | \
sed -e ':a ${s/^/(/;s/$/)/;p;d};s/^/</;s/$/>/;N;2,10ba;s/^/[/;s/$/]/;P;D'
[<<<<<<<<<<1>
[<2>
[<3>
[<4>
[<5>
[<6>
[<7>
[<8>
[<9>
[<10>
(11]>
12]>
13]>
14]>
15]>
16]>
17]>
18]>
19]>
20])