На какой стадии печатается шаблонное пространство sed? - PullRequest
2 голосов
/ 12 января 2011

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

И этот sed проходит через каждую строку текстового файла и для каждой из них выполняет все команды в выражении сценария или файле сценария.

Когда sed печатает пространство шаблона?Это в конце текстового файла, после того, как он сделал последнюю строку?Или это как завершающая часть обработки каждой строки текстового файла, просто после того, как он выполнил все команды, он сбрасывает пространство шаблона?

Может ли кто-нибудь продемонстрировать
a) максимальный предел пространства шаблона, равный двум?
b) факт, когда пространство шаблона печатается.И, если вы можете, пожалуйста, предоставьте текстовый источник, который тоже так говорит.

И почему здесь, в моей попытке увидеть размер пространства шаблонов, похоже, что он может уместиться много ..

Когда в этом уроке говорится
http://www.thegeekstuff.com/2009/12/unix-sed-tutorial-7-examples-for-sed-hold-and-pattern-buffer-operations/
Функция Sed G
Функция G добавляет содержимое области удержания к содержимому пространства шаблона.Прежнее и новое содержание разделены новой строкой.Максимальное количество адресов - два.

Пример того, что я нашел в отношении размера пространства шаблона, безуспешно пытаясь увидеть его ограничение в два раза. Abc.txt - текстовый файл, содержащий только символ z
sed h; G; G; G; G; G; G; G; G abc.txt
печатает много zs, поэтому я думаю, что он может содержать более 2.
Так что я неправильно понял кое-что(ы).

1 Ответ

5 голосов
/ 12 января 2011

Адрес - это способ выбора строк.Строки могут быть выбраны с использованием нуля, одного или двух адресов.Это никак не связано с емкостью пространства шаблона.

Рассмотрим следующий входной файл:

aaa
bbb
ccc
ddd
eee

Эта команда sed имеет нулевые адреса, поэтому она обрабатывает каждую строку:

s/./X/

Результат:

Xaa
Xbb
Xcc
Xdd
Xee

Эта команда имеет один адрес, она выбирает только третью строку:

3s/./X/

Результат:

aaa
bbb
Xcc
ddd
eee

Адрес $, как в $s/./X/, будет функционировать таким же образом, но для последней строки (независимо от количества строк).

Вот команда с двумя адресами.В этом случае он выбирает строки на основе их содержимого.Это может сделать и одна адресная команда.

/b/,/d/s/./X/

Результат:

aaa
Xbb
Xcc
Xdd
eee

Пространство шаблона печатается при наличии явной команды p или P или при сценариизавершается для текущей строки входного файла (которая включает в себя завершение обработки файла с помощью команды q), если опция -n (подавить автоматическую печать) отсутствует.

Вотдемонстрация sed печати каждой строки сразу после ее получения и обработки:

for i in {1..3}; do echo aaa$i; sleep 2; done | sed 's/./X/'

Емкость пространства образца (и пространства удержания) зависит от количества символов, которые оно может содержать (и зависит от реализации)), а не количество строк ввода.Новые строки, разделяющие эти строки, являются просто еще одним символом в этом итоге.Команда G просто добавляет копию пространства удержания в конец того, что находится в пространстве образца.Несколько приложений команды G добавляют столько копий.

В учебном пособии, на которое вы ссылались, выдается «Максимальное количество адресов - два».несколько двусмысленно.Это означает, что вы можете использовать ноль, один или два адреса для выбора строк для применения этой команды к .Как и в приведенных выше примерах, вы можете применить G ко всем строкам, одной строке или диапазону строк.Каждая команда может принимать ноль, ноль или один, или ноль, один или два адреса.См. man sed в разделе «Синопсис» для подзаголовков, которые группируют команды по числу адресов, которые они принимают.

С info sed:

3.1 Как работает `sed '

' sed 'поддерживает два буфера данных: активный шаблон пробел и вспомогательный удерживают пробел.Оба они изначально пусты.

«sed» работает, выполняя следующий цикл для каждой строки ввода: во-первых, «sed» читает одну строку из входного потока, удаляет любой завершающий символ новой строки и помещает его в шаблонпространство.Затем команды выполняются;каждая команда может иметь адрес, связанный с ней: адреса являются своего рода кодом условия, и команда выполняется только в том случае, если условие проверено перед выполнением команды.

Когда конец сценариядостигается, если не используется опция '-n', содержимое пространства шаблона распечатывается в выходной поток, добавляя обратно завершающий символ новой строки, если он был удален. (1) Затем начинается следующий цикл для следующей строки ввода.

Если не используются специальные команды (например, 'D'), пространство шаблона удаляется между двумя циклами.С другой стороны, пространство удержания хранит свои данные между циклами (см. Команды «h», «H», «x», «g», «G» для перемещения данных между обоими буферами).

...