С помощью ed, печатать отсюда до следующего появления.

Вопрос или проблема

Рассмотрим такой файл:

. 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 можно искать текстовые паттерны с помощью регулярных выражений, и это часто применяется для данного типа задач.

Практическое применение

Теперь, давайте посмотрим, как это можно реализовать:

  1. Поиск строки с символом "+":
    Выражение /\+/ указывает ed перейти к первой строке, содержащей символ ‘+’.

  2. Переход к следующему "—-":
    Выражение ;/----/ передвигает курсор на строку с следующим "—-" после текущей позиции.

  3. Вывод содержимого:
    Используя команду p, можно вывести содержимое от текущей позиции до найденной строки.

Однако, возникает проблема: если просто использовать команды, как /\+/;/----/p, то это не всегда будет работать корректно, так как p печатает с текущей позиции; а нам нужно включить и искомую строку. Включение и правильный захват строк можно сделать несколькими способами, но в ed часто используется поиск с включением нужного контекста.

Для этого нужно немного адаптировать алгоритм:

  • Для правильного вывода блока текста от строки с "+" до строки с "—-" включительно, можно использовать комбинирование с добавлением и вычитанием строк из поиска.

Финальная стратегия

Ваше предположение о применении ; (точка с запятой), чтобы переключиться на следующий набор инструкций — верное. Этот оператор позволяет изменять диапазон строк, используемых в последующих командах, что существенно.

Для данной задачи может подойти такой набор команд:

/^\+$/;/^----$/+1
p

Объяснение:

  • /^\+$/ находит строку, содержащую только +.
  • ;/^----$/+1 сдвигает выделение до строки, следующей за "—-".
  • p выводит выбранный блок текста.

Заключение

Работа с ed может показаться сложной из-за непривычного интерфейса, но она даёт отличный контроль за редактированием текстовых файлов в UNIX-системах. Можно сочетать мощь регулярных выражений с командной обработкой текстовых файлов, добиваясь сложной функциональности.

Понимание работы с ed, а также его команды и адресация строк позволят вам становиться более эффективным в решении подобных задач в будущем, и не только в рамках редактирования текстов, но и при работе с различными системными задачами в UNIX-системах. Надеемся, предоставленная информация поможет в решении вашей задачи с ed!

Оцените материал
Добавить комментарий

Капча загружается...