Форум русскоязычного сообщества Ubuntu


Следите за новостями русскоязычного сообщества Ubuntu в Twitter-ленте @ubuntu_ru_loco

Автор Тема: Каков алгоритм работы Sed с Буфером 1 и Буфером 2  (Прочитано 1039 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн alex-sky

  • Автор темы
  • Участник
  • *
  • Сообщений: 189
    • Просмотр профиля
 Если кто-может подскажите алгоритм работы sed.

Вот как это я понимаю.

Sed использует в своем арсенале 2 переменные:
- Основной буфер (Буфер1) и вспомогательный буфер (Буфер2)
Sed работает с файлом построчно, то есть загружает из входного потока по одной строке(входным потоком называется какой-либо файл со строками или данные переданные команде sed по конвейеру)
 Загружается 1-я строка куда ?
В Буфер 1?

Вот 1-й пример(взят со статьи в интернете)

Файл для опытов - f.txt

Код: (Bash) [Выделить]
1-я строка
2-я строка
3-я строка
4-я строка

 Скрипт меняет порядок строк, то есть строки которые были последними, становятся первыми.

sed-v1.sh

(Нажмите, чтобы показать/скрыть)

Цитировать
начиная со 2-й строки, содержимое буфера  (который уже содержит
# все предыдущие строки) добавляется к текущей строке.

Как это буфер уже что-то содержит и какой именно буфер , ?
А какой именно это буфер,  1-й или 2-й ?

Ну например как я понимаю...

1. Открывается файл и в Буфер 1 - заводится 1-я строка.
2. Читается код

и команда - 1! G - сообщает, что команда G не применяется к  1-й строке
$ - означает, что 1-я строка смотрится до конца и
p - печатается на экран.

1-я строка печатается на экран.
3. А вот дальше для 1-й строки команда h - что делает ??? или символ !, отменяет все команды для 1-й строки, а именно команды G и h , тогда почему срабатывает команда p для 1-й строки?

h -  Заменить содержимое вспомогательного буфера (Буфер 2) содержимым основного (Буфер 1), то есть Буфер 1 переносится в Буфера 2
 То есть то что находилось в Буфере  2 - удаляется безвозвратно или выводится на экран при удалении из данного Буфера 2?

4. Загружается 2-я строка в Буфер 1 .

G — Добавить новую строку к основному буферу (Буфер 1)  и затем добавить содержимое вспомогательного буфера (Буфер 2)  к содержимому основного (Буфер 1)

5. Команда G добавляет ко 2-й строке новую, пустую строку и в Буфере 1 - содержится 2-я строка и следом за ней пустая строка
 Затем эта же команда добавляет из Буфера 2 предыдущую строку, а именно 1-ю строку,
 Далее все что до конца текущей строки $ в Буфере  1  - выводится на экран

$ p

По логике должно быть вот так

Цитировать
2-я строка

1-я строка

То есть между ними должна быть пустая строка, но ее не видно.
 Я это наблюдал, когда работаешь с одной строкой в файле, тогда четко видно что командой G к строке загруженной в Буфер 1, добавляется пустая строка ???

h - Запись буфера в буфер2 (hold space).
Заменить содержимое вспомогательного буфера (Буфер 2),содержимым основного (Буфер 1).

Как я понимаю теперь все содержимое Буфера 1 помещается в Буфер 2 вот в таком порядке

Цитировать
2-я строка

1-я строка
Так ?

6. Теперь из входного потока в Буфер 1 (который уже пуст ???) захватывается 3-я строка.

к ней добавляется пустая строка и содержимое Буфера 2 и содержимое Буфера 1 выводится на экран , так ?

Цитировать
3-я строка

2-я строка

1-я строка

и т. д

Правильно ли я все понял, ответьте по возможности на мои вопросы.
 И зачем добавлять новую строку, и почему этой пустой строки не видно, когда обрабатываемый файл имеет много строк, а не одну
« Последнее редактирование: 26 Июля 2017, 14:16:04 от alex-sky »

Оффлайн Azure

  • Модератор раздела
  • Старожил
  • *
  • Сообщений: 6017
  • Windows10, i3wm on Debian9, Manjaro20.0
    • Просмотр профиля
alex-sky, перестаньте выдумывать свои названия/термины и сразу станет все понятно. Есть «pattern space» и «hold space» (предлагаемый перевод при наведении мыши на термин)

Пользователь добавил сообщение 26 Июля 2017, 19:25:21:
$ - означает, что 1-я строка смотрится до конца и
p - печатается на экран.

1-я строка печатается на экран.
Нет. Команда означает что рrint будет выполнена только для последней строки.
Получается скрипт читает строку, добавляет к ней содержимое HOLD, записывает полученную структуру обратно в HOLD.
« Последнее редактирование: 26 Июля 2017, 19:25:21 от Azure »
В Линукс можно сделать ВСЁ что угодно, достаточно знать КАК !

Оффлайн alex-sky

  • Автор темы
  • Участник
  • *
  • Сообщений: 189
    • Просмотр профиля
перестаньте выдумывать свои названия/термины и сразу станет все понятно.
Вот на этом ресурсе нашел

 http://emulek.github.io/sed/ch06s03.html#info_x,

спросить не у кого, поэтому на основе полученной информации для удобства и использую.




 

Страница сгенерирована за 0.041 секунд. Запросов: 25.