Выдержка из info sed
:
`sed' operates by performing the following cycle on each lines of
input: first, `sed' reads one line from the input stream, removes any
trailing newline, and places it in the pattern space. Then commands
are executed; each command can have an address associated to it:
addresses are a kind of condition code, and a command is only executed
if the condition is verified before the command is to be executed.
...
When the end of the script is reached, unless the `-n' option is in
use, the contents of pattern space are printed out to the output
stream,
...
Unless special commands (like 'D') are used, the pattern space is
deleted between two cycles
...
`N'
Add a newline to the pattern space, then append the next line of
input to the pattern space. If there is no more input then `sed'
exits without processing any more commands.
...
`D'
Delete text in the pattern space up to the first newline. If any
text is left, restart cycle with the resultant pattern space
(without reading a new line of input), otherwise start a normal
new cycle.
Это должно в значительной степени разрешить ваш запрос. Но все же я попытаюсь объяснить ваши три разных случая:
ДЕЛО 1:
* * 1010
sed
читает строку из ввода. [
Теперь в шаблонном пространстве есть 1 строка. ]
=
Печать текущей строки №.
N
читает следующую строку в пространстве образца. [
Теперь в пространстве образца есть 2 строки. ]
- Если нет следующей строки для чтения, то sed выходит здесь. [ т.е.: в случае нечетных строк, здесь выходит sed - и, следовательно, последняя строка проглатывается без печати. ]
sed
печатает пространство шаблона и очищает его. [
Пространство шаблона пустое. ]
Если
EOF
достиг
sed
, то здесь.
Иначе Перезапустите полный цикл с шага 1. [
т.е.: в случае четных строк здесь выходит sed. ]
Резюме: в этом случае sed читает 2 строки и печатает 2 строки за раз. Последняя строка проглатывается, если есть нечетные строки (см. Шаг 3).
ДЕЛО 2:
sed
читает строку из ввода. [ Теперь в шаблоне есть 1 строка. ]
N
читает следующую строку в шаблонном пространстве. [ Теперь в шаблонном пространстве 2 строки. ]
- Если это не удалось, выйдите отсюда. Это происходит только при наличии 1 строки.
- Если это не последняя строка (
$!
), выведите первую строку (P
) из пространства шаблона. [ Первая строка из пространства образца печатается. Но все же в шаблонном пространстве есть 2 строки. ]
- Если это не последняя строка (
$!
), удалите первую строку (D
) из пространства шаблона [ Теперь в пространстве шаблона есть только 1 строка (вторая). ] и перезапустите командный цикл с шага 2. И это из-за команды D
(см. Выдержку выше) .
- Если последняя строка (
$
), то удалить (d
) все пространство шаблона. [То есть. достигла EOF] [ Перед началом этого шага в пространстве образца было 2 строки, которые теперь очищены на d
- в конце этого шага пространство образца пустое. ]
sed
автоматически останавливается на EOF.
Резюме: В данном случае:
sed
читает сначала две строки.
- если есть следующая строка для чтения, выведите первую строку и прочитайте следующую строку.
- иначе удалите обе строки из кэша. Таким образом, он всегда удаляет последние 2 строки.
СЛУЧАЙ 3:
Это тот же случай, что и CASE: 1, просто удалите из него Шаг 2.