16. Текстовые редакторы в Unix. Редакторы vi/vim. Потоковый редактор sed. Команды sed. Обработка текстовых данных. Регулярные выражения, их использование в обработке текстов.
Редакторы для Unix делятся на 2 группы - редакторы командного стиля(vi, emacs, joe, ed) и меню-ориентированные (mcedit, kwriter, kword).
Редакторы командного стиля обычно работают в консольном (текстовом) режиме. Все действия в них выполняются подачей прямых управляющих команд, закрепленных за определенными сочетаниями клавиш. Мышь и меню в них, как правило, не используются.
Редактор vi присутствует как стандартный в любой Unix-подобной системе. Существует несколько редакторов основанных на vi: vim, elvis. Современные клоны vi (vim к примеру) обладают очень большой функциональностью, скрытой за аскетичным интерфейсом. Редактор vi изначально создавался как кросс-платформенный, который обязан работать на любых типах терминалов и виртуальных консолей. Все действия в нем можно осуществить не покидая основной, алфавитно-цифровой, части клавиатуры. Примечание. Далее мы будем рассматривать редактор vim. Однако все описанные команды можно будет применить в любом vi-совместимом редакторе.
В vi существует три принципиально различных режима работы:
- Командный режим (command mode)
- Режим ввода (edit mode)
- Режим построчного редактирования (ex mode)
Командный режим включается по умолчанию при запуске vi. В этом режиме нажатия клавиш не приводят к вводу символов, а интерпретируются как внутренние команды перемещения по тексту и редактирования. 1В этом качестве он внесен в стандарт Single Unix Specication 25 26 ГЛАВА 4. ТЕКСТОВЫЙ РЕДАКТОР VI Поэтому попытка немедленно начать ввод текста (как в DOS/Windows) ни к чему не приведет. Примечание. Если вы не знаете, в каком режиме находитесь, то нажмите клавишу ESC для перехода в командный режим. Создание текста в командном режиме невозможно. Для этого нужно перейти в режим ввода. Для этого служат команды (командного режима!) a (от append - после текущей позиции курсора) и i (от insert - перед текущей позицией курсора). В режиме ввода нажатия клавиш приводят к вводу обычных символов, позволяя создавать новый текст или редактировать существующий. Возврат в командный режим осуществляется нажатием клавиши escape. Для операций с документами (файлами) предназначен ex-режим. Он вызывается командой : командного режима. После этого дается команда ex-режима. Например: • открыть существующий файл (:e имя_файла) • вставить файл в позицию курсора (:r имя_файла) • записать файл (:w), в том числе под другим именем (:w имя_файла) • выход из сохраненного файла (:q) • выход с предварительным сохранением файла (:x) Когда вы находитесь в ex-режиме, то в нижнем левом углу экрана появляется :. Возможно совмещение команд ex-режима. Например :wq. Команда ex-режима отправляется на выполнение нажатием клавиши Enter после чего происходит возврат в командный режим. Примечание. Попытка загрузить новый файл (командой :e) или завершить работу редактора (командой :q) при несохраненном старом файле вызовет ошибку. 4.2 Получение помощи Получить справку можно используя ex-команду :help. Подразделы справки выделены значками |раздел|. Справку по ним вызывается через :help раздел. Очень полезным является учебник по vim - vimtutor. С его помощью можно освоить основные навыки использования vim. 4.3 Запуск и остановка редактора Vi (vim) может быть запущен из командной строки, с именем файла или без такового. Если указано имя файла, то редактор открывает его2 . 2Если файл не существует, то создается новый 4.4. ПЕРЕМЕЩЕНИЕ ПО ТЕКСТУ 27 Пример: $ vi ~/texts/newtext.txt Команда vim без имени файла откроет редактор vim и выведет заставку. Для выхода из редактора нажмите :q или :wq (см. “Режимы работы”4.1). 4.4 Перемещение по тексту В командном режиме существуют следующие команды3 : • h - курсор влево на 1 символ • l - курсор вправо на 1 символ • j - курсор вниз на 1 строку • l - курсор вверх на 1 строку Также, есть расширенные команды, действующие с блоками текста. • w и W - перемещение вперед на “маленькое слово”4 и т.н. “большое слово”5 • b и B - перемещение назад на “маленькое слово”и “большое слово” • 0 и $ - на начало и на конец строки • ( и ) - на начало предложения и его конец Вообще, для многих команд vi характерно наличие парных элементов
- в нижнем и верхнем регистрах одной клавиши (e и E, w и W); действие второй команды из пары как бы расширяет действие первой. Команды навигации vi могут использоваться с численными аргументами. Например команда 5h переместит курсор на 5 символов влево (считая символ в позиции курсора), а команда 3B на 3 “больших”слова назад. Для перемещения на конкретную строку, можно использовать следующую команду ex-режима: :N, где N - номер строки. 4.5 Ввод и редактирование текста Для создания текста необходимо перейти в режим ввода. Для этого служат следующие команды: • i и I - ввод в позиции курсора или в начале строки • a и A - ввод после курсора или в конце строки 3Обычно работают и стрелки на клавиатуре, но не стоит полагаться на них 4Отдельное слово, отделенное пробелом, знаками препинания, +, - 5Обязательно отделенное пробелом 28 ГЛАВА 4. ТЕКСТОВЫЙ РЕДАКТОР VI Текст можно изменять и в режиме ввода, используя DEL и BACKSPACE, но часто удобнее использовать команды редактирования. Команды редактирования предназначены для изменения существующего текста без перехода в режим ввода: • x - удаление одиночного символа • dd - удаление строки • dw - удаление слова • d) - удаление предложения Как и команды перемещения, команды редактирования можно использовать с численными аргументами. Так команда 5dd удалит текущую строку и еще 4 строки ниже ее, а 3dw удалит три слова считая текущее. 4.6 Копирование и вставка В vim для этих целей существует отдельный режим - выделения, Visual Selection (см. man vim). Однако в большинстве случаев мы можем обойтись стандартными командами: • p - вставить из буфера. • yy - скопировать строку в буфер • yw - скопировать текущее слово в буфер • y) - скопировать предложение • y} - скопировать абзац Примечание.В буфер также попадает все удаленное с помощью команд x, dd, dw и им подобных. Таким образом эти команды могут служить для копирования с удалением. Все вышеперечисленные команды могут использоваться с численным аргументом. Например: 3p - 3 раза вставить содержимое буфера. 4.7 Откат действий Действие ошибочно введенных команд редактирования может быть отменено командой u (сокращенно от undo). Повторное нажатие - отмена предыдущего действия, и так далее. Для возврата (redo) ошибочно отмененной операции используется control+r. 4.8. ПОИСК И ЗАМЕНА 29 4.8 Поиск и замена Для поиска по тексту служит команда / (прямой слэш). При вводе этого символа в командном режиме в нижней строке появляется символ /, после которого вы можете ввести образец для поиска. Это может быть текстовая строка или регулярное выражение (см. 5 ). После нажатия ENTER в тексте будут подсвечены 6 все возможные вхождения строки поиска и курсор перейдет к первому доступному найденому фрагменту вниз по тексту. Для поиска следующих вхождений строки поиска, существует команды n (вниз по тексту) и N (вверх по тексту). Для поиска и замены текстовых фрагментов, в том числе и с использованием регулярных выражений, предназначена команда ex-режима :s(substitute). Формат команды: :#s/pattern/string/опция где # - интервал строк (через , или ; - см. :help cmdline-ranges). Примечание. опции в стандартном vi не поддерживаются. Часто употребимые опции: c - подтверждение каждой замены, g - замена всех вхождений в строке. Примечание. Поиск и замена в vi возможны только для последовательности символов, составляющих 1 строку. Заменяющая последовательность символов тоже должна образовывать 1 строку. 4.9 Вызов внешних команд Редактор vim часто назывют средой, так как он позволяет полноценнно работать в системе, не выходя из редактора. Из vi можно запускать внешние программы с помощью команды exрежима :! cmdlline: Пример :! ls -l :! man bash Так работать гораздо удобнее, так как нет надобности постоянно входить и выходить из редактора. При запуске командной строки ее вывод будет сохранен на экране до нажатия пользователем клавиши ENTER. 6Это справедливо только для vim 30 ГЛАВА 4. ТЕКСТОВЫЙ РЕДАКТОР VI Глава 5 Регулярные выражения. sed Регулярные выражения (regular expression или regexp) - специальные строки символов, которые задаются для поиска совпадающих фрагментов. Иначе говоря это способ описания наборов букв. Простейшим набором является слово, но регулярное выражение может включать и глобальные символы, заменяющие другие символы. Все UNIXпрограммы, осуществляющие поиск в тексте, используют регулярные выражения. Если слово или фраза описаны регулярным выражением, говорят, что они соответствуют регулярному выражению. Регулярные выражения - мощное, гибкое и эффективное средство обработки текстов. Универсальные шаблоны регулярных выражений сами по себе напоминают миниатюрный язык программирования, предназначенный для описания и анализа текста. При дополнительной поддержке со стороны конкретной утилиты или языка программирования регулярные выражения способны вставлять, удалять, выделять текстовые данные любого вида и выполнять практичяески любые операции над ними. Регулярные выражения расширяют принципы метасимволов (шаблонов или wildcards). Некоторые программы используют регулярные выражения в чистом виде (grep, egrep). Но чаще всего регулярные выражения используются внутри специальных языковых конструкций, т. н. “оберток”. 5.1 Структура регулярных выражений Регулярное выражение состоит из двух типов символов. Специальные символы называются метасимволами. Все остальные символы (то есть обыч- ный текст), называются литералами. Регулярные выражения можно рассматривать как самостоятельный язык, в котором литералы выполняют функции слов, а метасимволы - функции грамматических элементов. Слова по определенным правилам объединяются сграмматическими элементами и создают конструкции, выражающие 31