Вопрос или проблема
Рассмотрим такой файл:
. hello
+
----
hello world
----
. world
. again
Как напечатать следующее?
+
----
hello world
----
Иными словами, я хочу “напечатать от + до следующих четыре тире”.
Мне кажется, что мне нужно использовать точку с запятой, как описано на странице https://wolfram.schneider.org/bsd/7thEdManVol2/adv.ed/adv.ed.pdf. Я пробовал /\+/;/----/;//p
, что близко; но пропускает плюс. Я также пробовал /\+/;/----/-;//p
и /\+/;/----/-;/----/p
, что не делают то, что я ожидаю — дойти до +, дойти до —-, напечатать с предыдущего, до следующего.
/\+/;/----/++p
работает в этом конкретном случае; но не обобщается.
Ответ или решение
Конечно, давайте подробно разберем, как с помощью редактора ed реализовать задачу по выводу текста от символа "+" до следующего четырёхтире.
Теоретическая часть
Рассмотрим, что из себя представляет редактор ed и как он работает. ed — это один из первых текстовых редакторов для UNIX-подобных систем, работающий с большим количеством текстовых файлов в режиме командной строки. Он особенный тем, что позволяет работать с текстом на уровне редактирования строк, используя команды, которые состоят из числовых адресов, символов и символических меток.
Основной принцип, на котором базируется работа ed, это работа с командами и регулярными выражениями для поиска и манипулирования текстом. Определённая команда используется для поиска строки, другая может применяться для вывода текста, а третья — для его замены и так далее.
Пример
Итак, у нас есть следующий текст:
. hello
+
----
hello world
----
. world
. again
Ваша задача — распечатать часть текста от ‘+’ до следующего "—-". В ed можно искать текстовые паттерны с помощью регулярных выражений, и это часто применяется для данного типа задач.
Практическое применение
Теперь, давайте посмотрим, как это можно реализовать:
-
Поиск строки с символом "+":
Выражение/\+/
указывает ed перейти к первой строке, содержащей символ ‘+’. -
Переход к следующему "—-":
Выражение;/----/
передвигает курсор на строку с следующим "—-" после текущей позиции. -
Вывод содержимого:
Используя командуp
, можно вывести содержимое от текущей позиции до найденной строки.
Однако, возникает проблема: если просто использовать команды, как /\+/;/----/p
, то это не всегда будет работать корректно, так как p
печатает с текущей позиции; а нам нужно включить и искомую строку. Включение и правильный захват строк можно сделать несколькими способами, но в ed часто используется поиск с включением нужного контекста.
Для этого нужно немного адаптировать алгоритм:
- Для правильного вывода блока текста от строки с "+" до строки с "—-" включительно, можно использовать комбинирование с добавлением и вычитанием строк из поиска.
Финальная стратегия
Ваше предположение о применении ;
(точка с запятой), чтобы переключиться на следующий набор инструкций — верное. Этот оператор позволяет изменять диапазон строк, используемых в последующих командах, что существенно.
Для данной задачи может подойти такой набор команд:
/^\+$/;/^----$/+1
p
Объяснение:
/^\+$/
находит строку, содержащую только+
.;/^----$/+1
сдвигает выделение до строки, следующей за "—-".p
выводит выбранный блок текста.
Заключение
Работа с ed может показаться сложной из-за непривычного интерфейса, но она даёт отличный контроль за редактированием текстовых файлов в UNIX-системах. Можно сочетать мощь регулярных выражений с командной обработкой текстовых файлов, добиваясь сложной функциональности.
Понимание работы с ed, а также его команды и адресация строк позволят вам становиться более эффективным в решении подобных задач в будущем, и не только в рамках редактирования текстов, но и при работе с различными системными задачами в UNIX-системах. Надеемся, предоставленная информация поможет в решении вашей задачи с ed!