Помогите пожалуйста понять как работает загрузка строк в буфер и работа цикла.
Если можно поясните по шагам.
Я много информации пересмотрел по sed, но не нашел ответа на свои вопросы.
1-й пример
#!/bin/sed -nf
# начиная со 2-й строки, содержимое буфера (который уже содержит
# все предыдущие строки) добавляется к текущей строке.
1! G
# при достижении последней строки - печатаем
$ p
# Заносим данные в буфер опять
h
# 1 - это адрес, означает 1-ю строку
# ! это символ инверсии
# Команда следующая после символа " ! "
# применяется ко всем строкам, кроме 1-й строки.
# G - Добавить новую строку к основному буферу (Буфер 1)
# и затем добавить содержимое вспомогательного буфера (Буфер 2)
# к содержимому основного (Буфер 1)
# $ - это символ регулярного выражения, означает конец строки
# p - Печать Буфера 1 (в stdout - на экран).
# Эту команду имеет смысл использовать только при использовании опции -n.
# h - Заменить содержимое вспомогательного буфера (Буфер 2) содержимым основного (Буфер 1)
начиная со 2-й строки, содержимое буфера (который уже содержит
# все предыдущие строки) добавляется к текущей строке.
Как это буфер уже что-то содержит ?
А какой именно это буфер ?
Ну например как я понимаю...1. Открывается файл и в Буфер 1 - заводится 1-я строка.
2. Читается код и команда
1! G - сообщает, что команда G не применяется к 1-й строке
$ - означает, что 1-я строка смотрится до конца и
p - печатается на экран.
3. А вот дальше для 1-й строки команда h - что делает
4. Загружается 2-я строка в Буфер 1 .
5. Команда G добавляет ко 2-й строке новую, пустую строку и в Буфере 1 - Кроме этого что-то из Буфера 2 добавляется к Буферу 1
и теперь 2-я строка и пустая строка и то-что было добавлено из Буфера 2 - выводятся на экран.
Так что-же находится в Буфере 2 ?
А как здесь работает команда h ?
2-й пример (цикл)
#!/usr/bin/sed -rf
h
:b
# если строка последняя - печать и выход.
# h - Запись буфера в буфер2 (буфер2 - hold space (область удержания).
# : LABEL
# Безадресная команда. Она задаёт метку, для перехода командами t, T, и b.
# b [LABEL]
# Безусловный переход на метку LABEL. Если LABEL не применяется, то завершает этот
# цикл, и начинает следующий.
# b label
# Переход на метку label. Если такой метка не задана, то переход выполняется в конец
# скрипта.
$b
# загружаем следующую строку
N
/^(.*)\n\1$/ {
# сл. строка такая-же как прошлая, выгружаем
# прошлую из области удержания, как-бы отменяя действие команды N
g
bb
}
#N (добавление следующей строки к буферу).
#Эта команда работает так-же как n, однако новая строка не затирает буфер, а добавля
#ется к нему через \n. (см так-же info sed).
# если команда N загрузила посл. строку, печатаем две посл. строки сразу.
$b
# строки разные, мы сначала печатаем первую из них
P
# потом её удаляем
D
# и при окончании этого цикла печатается следующая строка.
Здесь то же непонятно как и в какой последовательности идет работа с Буферами 1 и 2 ?
Почему сразу применяется команда h ?
$ b - эту команду как понимать ?
bb - а это что за команда ?
: b - ":" - означает какую-то функцию, которая определяет переход по меткам
Например,
:
Metka - переход в коде на место где написано
Metka - вот это болеее понятно.
Подскажите пожалуйста? если кто знает алгоритм работы sed.