Операционная система UNIX

         

Дозапись текста



6.2.1. Дозапись текста

Если создан пустой файл и необходимо записать в него некоторый текст, следует установить режим дозаписи командой: a в ответ система переведет курсор на новую строку.

Для отмены режима дозаписи в первой позиции строки вводится команда "." (точка) , за которой следует символ "конец строки" (<CR>).

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



Команда печати (n)



6.7.1. Команда печати (n)

Команда печати n распечатывает текст и предваряет каждую строку текста номером по порядку. Эту команду полезно использовать перед удалением, созданием или изменением строк.

Формат команды: [n[, k]]n<CR> где n, k - номера начальной и конечной печатаемых строк.

Пример использования клманды "n":

Пример. 1, $n<CR> 1 This is the first line of test. 2 This is the second line. 3 This is the third line. 4 This is the fourth line. 5 five 6 six 7 seven 8 eight 9 nine 10 ten



Команда печати (p)





6.6.1. Команда печати (p)

По данной команде производится выдача строк файла, находящегося в буфере редактора.

Формат команды: [n[, k]]p<CR> где n, k - номера начальной и конечной печатаемых строк.

Команде "p" может предшествовать один или два номера строки. Если номер не задан, то редактор печатает текущую строку.

Если задан номер только одной строки (с последующей буквой "p" или без нее), то печатается одна заданная строка (и она становится текущей).

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

Вы можете таким образом распечатать весь файл. Если вы не знаете номер последней строки, то поставьте символ $. Примеры. 1,2p - печать первых двух строк буфера; 1,$p - печать всех строк буфера; символ $ используется для обозначения последней строки буфера; $-1, $p - печать двух последних строк буфера; dfn .-3, -1p печать трех предыдущих строк.

В сущности, команде "p" могут предшествовать 0, 1 или 2 номеров строк. Если номера строк не указаны, печатается текущая строка. Однократное нажатие клавиши <CR> вызывает печать следующей строки: оно эквивалентно команде ".+1p". Команда "-" эквивалентна команде ".-1p".



Команда редактирования файла (e)



6.5.1. Команда редактирования файла (e)

Формат команды: e имя_файла<CR>

По данной команде файл с именем "имя_файла" копируется в буфер редактора. Предыдущее содержимое буфера при этом теряется.

Редактор сохраняет имя скопированного в буфер файла, благодаря чему после завершения редактирования файла нет необходимости задавать его имя в команде записи "w". Команда "w" произведет запись именно в этот файл.

Команда языка shell: ed имя_файла<CR> эквивалентна командам ed<CR> e имя_файла<CR> По завершению чтения файла выдается размер считанного файла (в байтах).



Команда указания имени файла (f)



6.15.1. Команда указания имени файла (f)

Данная команда предназначена для запроса или изменения сохраняемого редактором имени файла (текущего имени).

Формат команды: f [файл]<CR>

В ответ на команду "f" без агрумента редактор напечатает сохраненное им ранее имя файла (текущее).

Это имя запоминается редактором при вызове по команде shell: ed file или по команде редактора: e file Например, в результате выполнения команды: f file1 имя файла, хранимое редактором, будет заменено на новое имя "file1", и оно станет текущим.

Команда записи "w" без аргументов копирует буфер редактора в файл с текущим именем.

Пример создания двух вариантов файла "file1": ed file1 f file2 ... w w file3 q



Конструкция / /



6.11.1. Конструкция /.../

Формат команды: /текст/ где "текст" - искомый текст.

Редактор просматривает буфер, начиная со строки ".+1" (т.е. следующей за текущей), идет до конца буфера, затем продолжает поиск с первой строки буфера и до текущей строки включительно. При обнаружении строки с заданным текстом редактор распечатывает ее, и эта строка становится текущей.

В случае отсутствия в буфере искомого текста редактор возвращается к текущей строке и печатает символ "?".

Пример. /lop/ найти в буфере строку, содержащую последовательность символов "lop".

Команда поиска в комбинации с другими командами ("a", "i", "s", "t", "m") может успешно использоваться для указания необходимой строки.

Примеры. /lop/s//loop/p найти строку, содержащую слово "lop", и заменить его на "loop", затем распечатать эту строку; /текст/i поиск строки, содержащей указанный текст, и вставка перед найденной строкой.

В команде "s" искомый текст в левой части можно не указывать.



Метасимвол (точка)



6.16.1. Метасимвол . (точка)

В зависимости от контекста символ "." имеет несколько значений. lin В левой части команды подстановки и при поиске с помощью конструкции "/.../" символ "." означает любой одиночный символ. Таким образом, в результате поиска /x.y/ будут найдены строки текста, содержащие символы "x" и "y", между которыми находится любой символ, например: x+y x-y x y

Символ ".", используемый для указания номера строки обозначает текущую строку.

Примеры. .+1s/a/,/ замена символа "a" на символ "," в строке, следующей за текущей. Символ ".", записанный в правой части команды замены "s", не имеет специального значения; 1, 5s/,/./ замена символа "," на символ "." в строках с 1-й по 5-ю включительно.

Команда : .s/././ иллюстрирует все значения символа ".". Первая "." в команде - это номер текущей строки, вторая "." это метасимвол, который соответствует любому одному символу данной строки, третья "." - это настоящая точка в команде замены.

Такая команда, примененная, например к строке: ОШИБКА ЧТЕНИЯ. дает результат: ОШИБКА ЧТЕНИЯ.



Разбиение строк



6.14.1. Разбиение строк

Редактор обеспечивает возможность разбиения строки на несколько более коротких строк путем вставки символов новой строки. Например, строка: текст xy текст может быть разбита на две между символами "x" и "y" следующим образом: s/xy/x\ y/ команда: s/xy/x\ zzz\ y/ разобьет исходную строку на три, при этом будет добавлена строка "zzz".



Команда чтения файла (r)



6.5.2. Команда чтения файла (r)

Формат команды: [n]r имя_файла<CR> где n - номер строки в буфере, после которой помещается файл.

Команда "r" читает содержимое файла в буфер редактора, причем содержимое файла добавляется к тому, что уже хранится в буфере.

Если "n" отсутствует, то читаемая информация дописывается после последней строки, хранящейся в буфере, в противном случае, считываемый файл помещается после строки с номером "n".

Если имя файла отсутствует в команде, то считывается файл, имя которого является текущим.

По завершению чтения редактор выдает размер считанного файла (в байтах).



Команда печати (l)



6.6.2. Команда печати (l)

Команда "l" аналогична команде "p", но предоставляет больше информации. Ее главным свойством является то, что она печатает управляющие символы, такие как символы табуляции (tab) и возврата на позицию (backspace). Кроме того, команда "l" переносит строки при печати. Например, любая строка, длина которой превышает 72 символа, печатается на нескольких строках. Чтобы указать, что строка была перенесена и где она была перенесена, в конце каждой части переносимой строки вставляется обратная дробная черта (\).

Некоторые управляющие символы: символ табуляции - печатается как ">"; код возврата на позицию - печается как "<"; код перехода на новый лист - печатается как "\14"; код вертикальной табуляции - печатается как "\13"; "звуковой сигнал" - печатается как "\07"; код "новая строка" - печатается как "\n".



Конструкция ? ?



6.11.2. Конструкция ?...?

Редактор производит поиск не только в прямом, но и в обратном направлении. Для этого в команде поиска вместо символа "/" используется символ "?": ?текст?

Это удобно в случае, если при редактировании текста необходимо вернуться назад.



Метасимвол \ (обратная дробная черта)



6.16.2. Метасимвол \ (обратная дробная черта)

Обратная дробная черта (или обратный слэш) отменяет специальное значение, которое может иметь следующий за ней символ, в частности, "\." означает точку, а не "любой символ". Примеры. s/\./?/ замена символа "." на символ "?"; /\.pp/ поиск строк, содержащих ".pp"; /\/ поиск символа "\"; /\// поиск символа "/"; s/\\\.// удаление в текущей строке последовательности символов ".".

Для разделения полей в команде "s" может использоваться любой символ, а не только дробная черта (однако для контекстного поиска требуется использовать дробную черту). Например, если строка уже содержит много символов дробной черты, как в строке: //exec//sys.fort.go //etc ... то можно использовать в качестве разделителей символ ":" (двоеточие). Удалить все символы дробной черты можно с помощью команды: s:/::g

Если для стирания символов и удаления строк используются клавиши "#" и "@", их нужно вводить в виде "\#" и "\@" (это относится не только к работе с ed).

Если текст вводится с помощью одной из команд: "a", "i" или "c", то символ обратной дробной черты не является специальным, и требуется нажимать эту клавишу только один раз для каждой обратной дробной черты.



Объединение файлов



6.15.2. Объединение файлов

Предположим, что в файле "file1" сразу же после слов "текст..." требуется вставить "file2".

Для этого необходимо вызвать редактор для фала "file1", найти символы "текст..." и добавить в это место файл "file2": ed file1 /текст.../ текст... (ответ редактора) .r file2

Команда "r" без адресов добавляет читаемые строки в конец, т.е. работает аналогично "$r".



Объединение строк (j)



6.14.2. Объединение строк (j)

Объединение строк осуществляется с помощью команды "j". Например, если имеются строки: текст x y текст то установив первую строку текущей и задав команду "j", получим: текст xy текст

Можно объединить все строки в одну большую строку и распечатать ее.



Восстановление после останова



6.17.2. Восстановление после останова

Если произойдет неожиданный останов, система UNIX пытается сохранить содержимое буфера редактора в специальном файле ed.hup. Позднее вы можете попытаться восстановить текст из этого файла одним из двух способов. Первый: вы можете воспользоваться командой shell, чтобы переписать файл ed.hup в файл с другим именем. Второй: вы можете войти в редактор ed и воспользоваться командой f для переименования в буфере: ed ed.hup<CR> 928 f myfile<CR> myfile



Командные файлы редактора



6.17.3. Командные файлы редактора

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

Предположим, например, что нужно заменить каждое слово "версия1" на "версия2" и каждое слово "1985" на "1986" в большом количестве файлов. Поместим в файл "list" следующий строки: g/версия1/s//версия2/g g/1985/s//1986/g w q после этого можно воспользоваться командами: ed file1 < list ed file2 < list ...

Это приведет к тому, что редактор ed будет получать команды из ранее приготовленного файла. В этом случае вся работа должна планироваться заранее.

С помощью интерпретатора команд системы можно более или менее легко просмотреть набор файлов циклически.



Копирование строк (t)



6.14.3. Копирование строк (t)

Для копирования строк текста в буфере редактора используется команда "t".

Формат команды: [n[, k]]tl<CR> где n, k - номера начальной и конечной заменяемых строк;
t - имя команды копирования;
l - номер строки, после которой размещаются копируемые строки с номерами от "n" до "k" включительно.

По данной команде строки с номерами от "n" до "k" включительно пересылаются на место после строки с номером "l".

Если в команде задан только номер одной строки, то пересылается строка с указанным номером.

Если номер строки не задан, то пересылается текущая строка.

Строки с номерами от "n" до "k" включительно сохраняются на своем прежнем месте.

Команду "t" удобно использовать для создания текстов с повторяющимися данными.

Пример. 1, 7t15 группу строк с 1-й по 7-ю поместить после 15-й строки.



Метасимвол $ (денежный знак)



6.16.3. Метасимвол $ (денежный знак)

В зависимости от того, как используется знак денежной единицы ($), он может обозначать конец файла или конец строки. Когда указывается диапазон (от строки 1 до строки $), совершенно ясно, что речь идет о конце файла. "1, $p" вызовет распечатку всего файла. Но запись "s/$/./p" указывает, что точка будет помещена в конце текущей строки.

В команде: $s/$/$ первый символ "$" означает последнюю строку файла, второй означает конец этой строки, а третий действительно является символом денежной единицы, который добавляется к указанной строке.



Продолжение поиска



6.11.3. Продолжение поиска

Если при поиске строки с искомым текстом оказалось, что это не та строка, то для продолжения поиска нужно задать команду в виде:
// - продолжить поиск в прямом направлении;
?? - продолжить поиск в обратном направлении.



Разбиение файла



6.15.3. Разбиение файла

Предположим, что нужно выделить в отдельный файл некоторую таблицу, чтобы ее можно было отдельно форматировать и проверять. .TS ... (содержимое) .TE

Для выделения этой таблицы в отдельный файл с именем "table" в первую очередь нужно найти начало этой таблицы (строку "TS"), а затем записать соответствующий фрагмент в файл: /^\.TS .TS (редактор печатает найденную строку) .,/^\.TE/w table

В результате этого поставленная цель будет достигнута. Можно выполнить все это и в одной команде: /^\.TS/;/^\.TE/w table

Дело в том, что команда "w" может выполнять запись не всего файла, а некоторой группы строк. При желании можно записать даже одну строку, для этого надо задать один номер строки вместо двух.



Метасимвол ^ (отрицание)



6.16.4. Метасимвол ^ (отрицание)

Метасимвол "^" применяется так же, как метасимвол "$", за исключением того, что он указывает начало строки, а не конец.

Примеры. /^время/ поиск строки, начинающейся со слова "время"; s/^/ / поместить пробел в начало текущей строки.

Метасимволы можно объединять. Например, для того, чтобы найти строку, содержащую только символы "pp" можно использовать команду: /^.pp$/



Перекомпоновка файла



6.15.4. Перекомпоновка файла

Перестройка строк



6.14.4. Перестройка строк

Предположим, что в начале каждой строки файла стоят имена вида: Петров П.К. Иванов С.Б и т.д., требуется переделать текст таким образом, чтобы инициалы стояли перед фамилиями, т.е. П.К. Петров С.Б. Иванов

Такой результат можно получить с помощью нескольких команд редактирования, что однако достаточно сложно и может привести к целому ряду ошибок.

Альтернативный метод заключается в том, чтобы отметить элементы строки (в данном случае фамилию и инициалы), а затем переставить эти элементы. Если в левой части команды подстановки "s" какой-либо элемент образца заключен в "\(" и "\)", то он запоминается и может использоваться в правой части команды. В правой части команды обозначение "\1" относится к тому, что соответствало первой паре \(...\), "\2" - второй паре и т.д.

Следующая команда: 1, $s/^\([^ ]*\) *\(.*\)/\2 \1/ выполняет нужную работу, хотя ее и трудно прочитать. Первая пара \(...\) соответствует фамилии, которая представляет собой любую строку символов вплоть до пробела; в правой части команды на нее выполняется ссылка с помощью "\1". Вторая пара \(...\) обозначает то, что стоит после запятой и любого количества пробелов, а ссылка на нее выполняется с помощью "\2".



Режим шифрования



6.17.4. Режим шифрования

При обработке зашифрованных файлов, редактор вызывается с параметром "-x": ed -x имя_файла<CR>

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

Переход в режим шифрования возможен и в процессе сеанса. С этой целью пользователь может установить текущий ключ с помощью команды: x После чего будет выдана подсказка: Entering encrypting mode! Key: и пользователь набирает ключ (при этом символы не отображаются на экране терминала). Признаком окончания ввода ключа является ввод <CR>. Ввод ключа нулевой длины отменят режим шифрования.



Маркеры



6.14.5. Маркеры

Редактор ed позволяет пометить строку некоторым именем, чтобы впоследствии обращаться к ней по этому имени независимо от фактического номера строки. Это удобно при перемещении строк и отслеживании их по мере перемещения. Для маркировки используется команда назначения имени. Если ввести команду "kx", то текущая строка будет отмечена маркером с именем "x". Если перед "k" указывается номер строки, будет отмечена соответствующая строка. (Имя должно представлять собой одну строчную букву латинского алфавита). После этого можно ссылаться на отмеченную строку с помощью адреса "'x".

Пример.
Пусть после создания файла были выполнены следующие команды: a Первая строка вводимого текста Вторая строка Третья строка Последняя строка . -3 ka 2 kb $ 'a, 'bm в результате будет получена следующая последовательность строк: Третья строка Последняя строка Первая строка вводимого текста Вторая строка



Метасимвол * (звездочка)



6.16.5. Метасимвол * (звездочка)

Метасимвол "*" означает, что символ, за которым он следует, может повторяться произвольное число раз.

Если в тексте имеется большое количество пробелов, их можно сжать, например: Московское время 18 часов В результате выполнения команды: s/e *время 1/e время 1/p получим: Московское время 18 часов

Если скомбинировать точку и *, то можно сопоставить все символы. С помощью этой комбинации можно, например, заменить все символы в последней части строки: p<CR> Toads are alimy, cold creatures s/are.*/are wonderful and warm <CR> Toads are wonderful and warm ed автоматически запоминает последнюю строку символов в шаблоне поиска или замененный текст. Однако вы должны подсказать ed, что нужно повторить замену, используя знак "%". Знак "%" позволяет вам сделать одинаковую замену во многих строках, не используя глобальной замены. Например, заменим слово money на слово gold, повторим последнюю замену в строках от 1 до 3: 1, $n<CR> 1 I love money 2 I need food 3 I use money 4 The IRS wants my money ls/money/gold<CR> I love gold 3s//g<CR> I use gold 1, $n<CR> 1 I love gold 2 I need food 3 I use gold 4 The IRS wants my money

ed автоматически запоминает слово money, так что строка не будет повторена между первыми двумя ограничителями. Знак "%" говорит ed - использовать последний шаблон для замены (gold).



Программа grep



6.17.5. Программа grep

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

Программа grep языка управления заданиями предназначена для печати всех строк, соответствующих указанному образцу. Так, команда: grep "нечто" файл1 файл2 файл3 ...<CR> находит "нечто" везде, где оно встречается в файлах. Команда "grep" указывает также файл, в котором была найдена каждая строка и (если задан параметр "-n") номер строки.

Образец, обозначенный "нечто", может быть любым образцом, который вы используете в редакторе, т.к. grep и ed используют один и тот же механизм поиска образцов. Если образец содержит какие-либо неалфавитные символы, его целесообразно всегда заключать в апострофы ('...'), поскольку многие такие символы имеют специальное значение для интерпретатора команд shell. Если не поместить их в апострофы, интерпретатор команд попытается обработать их перед тем, как они будут переданы команде grep.

Существует также возможность находить строки, которые не содержат указанного образца. Команда: grep -v "нечто" файл1 файл2 ...<CR> находит все строки, которые не содержат "нечто". Ключ "-v" должен находиться в указанной позиции. С помощью команд "grep" и "grep -v" можно выбирать строки, содержащие некоторую комбинацию образцов. Например, для получения всех строк, содержащих "x", но не содержащих "y", можно использовать команду: grep x файл ... | grep -v y<CR> (символ "|" означает, что результат работы первой команды используется в качестве входа второй команды).



Адресная арифметика



6.14.6.1. Адресная арифметика

Рассмотрим использование указателей строк вида ".", "$", "/.../" и "?...?" в сочетании с действиями "+" и "-". Так, команда: $-1 выдает предпоследнюю строку текущего файла.

Команда: $-5, $p распечатывает последние шесть строк. Если в файле нет шести строк, будет выдано сообщение об ошибке ("?").

Команда: .-3, .+3p распечатывает 7 строк, из них три строки до и три строки после текущей строки. Знак "+" может быть опущен. Знак "-" сам по себе представляет собой команду для возврата на одну строку в файле.

Команда: --- вызывает возврат на три строки, как и команда "-3".

Команда: -, .s/bad/good/ вызывает замену "bad" на "good" в текущей и пред- шествующей ей строках.

Знаки "+" и "-" могут использоваться при поиске с помощью "/.../", "?...?" и с "$". По команде: /текст/-- разыскивается строка, содержащая "текст", после чего текущей строкой становится строка вторая перед найденной строкой.



Номера строк и указатель текущей строки



6.14.6.2. Номера строк и указатель текущей строки

Разрешается определять диапазон "n,m" (от строки с номером "n" до строки с номером "m"), где "n" - номер начальной строки, а "m" - номер конечной строки. Весь файл целиком с первой до последней строки задается диапазоном "1, $". Так, команда: 1, $p вызывает выдачу всех строк файла.

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

Пример.

Команда: 5p устанавливает указатель текущей записи на пятую строку.

В любой момент времени можно определить, каков текущий номер строки. Это делается с помощью команды ".=".

Использование этой команды полезно после внесения многочисленных изменений в файл.

Можно указать несколько строк, задав диапазон "от, до". Указатель текущей строки "." можно использовать на месте начальной или конечной строки диапазона. Так, команда: ., $p печатает все строки от текущей до конца файла.



Изменение указателя текущей строки



6.14.6.3. Изменение указателя текущей строки

При использовании команд поиска просмотр всегда начинается с текущей строки и продолжается в прямом или обратном направлении до тех пор, пока не будет обнаружена строка с искомым текстом. Например, если буфер содержит строки: . АБ . . БВ . и, если текущая строка - первая, то команда: /А/, /Б/p не распечатает строки, расположенные в промежутке от строки "АБ" до строки "БВ", так как при использовании запятой в качестве разделителя указателей строк, номер текущей строки не изменяется после обработки каждого адреса, каждый поиск начинается от текущей строки. В результате будет распечатана одна строка "АБ".

При указании диапазона адресов вместо запятой используется точка с запятой. Символ ";" вызывает установку в то место, которое определяется при вычислении номеров строк. Фактически редактор "перемещает" указатель текущей строки. Команда: /А/; /Б/p распечатывает строки в диапазоне от "АБ" до "БВ", т.к. после нахождения строки с "А" эта строка становится текущей и поиск "Б" начинается после этой строки.



Прерывание работы редактора



6.14.6.4. Прерывание работы редактора

Если во время выполнения команды была нажата клавиша прерывания, будет восстановлено состояние, максимально приближающееся к тому, которое было перед началом выполнения команды. Естественно, некоторые изменения являются бесповоротными: если в этот момент читался или записывался файл, выполнялась подстановка или удаление строки, эти команды будут остановлены в некотором промежуточном (непредсказуемом) состоянии, указатель текущей строки изменится.

Более определенно прерывается команда печати. Положение указателя текущей строки не изменяется до тех пор, пока печать не завершится. Таким образом, если запущена команда печати и она не напечатала нужную строку, при нажатии клавиши прерывания текущей строкой останется та строка, которая была в момент запуска команды "p".



Команда g



6.14.7.1. Команда g

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

Общий вид командной строки (строк) с использованием команды "g" следующий: g/образец/ команда или перечень команд<CR> Примеры. g/abdc/p печать всех строк буфера, содержащих последовательность "abdc"; g/abcd/s//efjc/gp замена и печать всех строк буфера, в которых найдена последовательность "abcd"; 1, $s/abcd/efjc/gp замена во всех строках последовательности "abcd" на "efjc" и печать последней заменяемой строки; g/xxx/.-1s/abc/def/\ .+2s/ghi/jkl/\ .-2, .p замена в строках до и после каждой строки, содержащей "xxx", и печать всех трех строк.



Команда v



6.14.7.2. Команда v

Команда "v" аналогична команде "g" за исключением того, что она работает с теми строками, которые не содержат заданный образец.

Общий вид командной строки (строк) при использовании команды "v": v/образец/ команда или перечень команд<CR> Пример. v/xxx/s/aaa/bbb/ заменить во всех строках файла последовательность "aaa" на "bbb" кроме строк, в которых имеется последовательность "xxx".



Перемещение строк (команда m)



6.15.4.1. Перемещение строк (команда m)

Данная команда предназначена для перемещения строк в буфере редактора.

Формат команды: [n[, k]]ml<CR> где n, k - номера начальной и конечной перемещаемых строк;
m - команда перемещения;
l - номер строки, после которой надо поместить строки с номерами от "n" до "k" включительно.

По данной команде строки с номерами от "n" до "k" включительно помещаются после строки с номером "l", причем на прежнем месте эти строки не сохраняются.

Пример. 1, 3m$ группу строк с 1-й по 3-ю поместить после последней строки в буфере редактора.

Если указан один номер строки, то перемещается только эта строка.

Если номер отсутствует, то перемещается текущая строка.

Данная команда может успешно использоваться вместе с командой поиска.

Например, имеется следующий текст: ПЕРВЫЙ ПАРАГРАФ (текст) КОНЕЦ ПЕРВОГО ПАРАГРАФА ВТОРОЙ ПАРАГРАФ (текст) КОНЕЦ ВТОРОГО ПАРАГРАФА

Если необходимо переставить параграфы местами, то это можно выполнить с помощью команды: /ВТОРОЙ/, /КОНЕЦ ВТОРОГО/m/ПЕРВЫЙ/-1

Строки, начиная со строки, содержащей слово "ВТОРОЙ", до строки, содержащей слова "КОНЕЦ ВТОРОГО" включительно, помещаются перед строкой, содержащей слово "ПЕРВЫЙ".

По завершинию операции перемещения текущей строкой становится последняя перемещенная строка (в последнем примере - это строка со словами "КОНЕЦ ВТОРОГО").



Копирование строк текста (t)



6.15.4.2. Копирование строк текста (t)

Команда копирования "t" аналогична команде "m", за исключением того, что блок текста не удаляется, а копия этого блока помещается после указанной строки текста.

Формат команды: [n[, k]]tl<CR> где n, k - номера начальной и конечной копируемых строк; если указано только n, то копируется одна строка с номером n; если номер строки не указан, то копируется текущая строка;
t - команда копирования;
l - номер строки, после которой надо поместить строки с номерами от "n" до "k" включительно.

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

Пример. 5, 8n<CR> 5 Close the door of the room. 6 Break glass of neareat alarm. 7 Pull lever. 8 Locate and use fire extinguishar. 30n<CR> 30 A chemical fire in the lab requires that you: 6,8t30<CR> 30, $n 30 A chemical fire in the lab requires that you: 31 Break glass of neareat alarm. 32 Pull lever. 33 Locate and use fire extinguishar. 6, 8n<CR> 6 Break glass of neareat alarm. 7 Pull lever. 8 Locate and use fire extinguishar.

Текст с 6-й по 8-ю строки остается на месте, копия этих трех строк помещается после 30-й строки.



Временный выход из редактора



6.17.1. Временный выход из редактора

Иногда бывает удобно на некоторое время выйти из редактора, для выполнения какой-либо другой команды, не покидая редактор. Это можно сделать с помощью команды временного выхода "!".

Если ввести: !команда_системы процесс редактирования приостанавливается и выполняется указанная команда. Редактор сообщает о завершении этой команды, печатая еще один восклицательный знак "!", после этого можно снова возобновлять редактирование.



Адресация строк в редакторе



6.14.6. Адресация строк в редакторе

Команды помощи



6.17.6. Команды помощи

Обратите внимание, что когда вы редактируете файл, редактор ed иногда в ответ на введенную вами команду отвечает знаком "?". Знак "?" означает диагностическое сообщение при обнаружении ошибки. Команды помощи выдают вам короткое сообщение, объясняющее причину ошибки. Существуют две команды помощи:
h - отображает короткое сообщение об ошибке;
H - устанавливает в ed режим распечатки короткого сообщения об ошибке каждый раз, когда появляется "?". Для отмены этого режима вновь введите H.

Если попытаться завершить работу с ed, не записав измененный буфер в файл, то появится знак "?". Когда появится "?", введите "h": q<CR> ? h<CR> warning: expecting "w"



Метасимволы [] (квадратные скобки)



6.16.6. Метасимволы [] (квадратные скобки)

Метасимволы "[]" позволяют определить подмножество символов, которые необходимо распознавать при выполнении операции поиска или подстановки. Запись группы символов, заключенных в квадратные скобки, означает: "любой одиночный символ из указанных". Например, если "[0123456789]", это будет означать: "любая цифра". Можно записать и короче: "[0-9]". Запись двух символов, разделенных знаком минус, означает задание интервала в

лексикографической последовательности символов. Так, запись "[А-Я]" означает: "прописная русская буква", а запись: "[a-z] [a-z0-9]*" означает последовательность латинских букв и цифр, начинающуюся с буквы.

Указание в начале класса символа "^" означает "ни один из следующих символов". Например: ^[0-9] обозначает "любой символ, за исключением цифры".

Примеры. 1, $s/^[0-9]*// удаление всех цифр в начале каждой строки; /^[^(пробел)(табуляция)]/ поиск первой строки, не начинающейся символом пробела или табуляции.

Внутри класса символов могут присутствовать любые символы и, чтобы избежать путаницы, в квадратных скобках символы принципиально не имеют специального значения. Например, чтобы найти специальные символы, можно использовать команду: /[.[]/ Внутри "[...]" символ "[" не является специальным. Чтобы включить символ "]" в класс символов, нужно указать его первым.



Глобальные команды



6.14.7. Глобальные команды

Глобальные команды используются для поиска и редактирования тех строк в буфере редактора, которые содержат или наоборот не содержат заданный образец.

Глобальная команда в строке должна быть первой, затем идет образец и команды редактора. Допускается написание нескольких команд редактора, но в этом случае каждая команда должна располагаться на отдельной строке, и каждая строка, за исключением последней, должна заканчиваться символом "\".



Метасимвол & (амперсенд)



6.16.7. Метасимвол & (амперсенд)

Символ "&" используется в первую очередь для сокращения вводимого текста.

Предположим, имеется строка: В ЭТО ВРЕМЯ и требуется преобразовать ее в строку: В ЭТО ВРЕМЯ СУТОК конечно, для этого можно воспользоваться командой: s/ВРЕМЯ/ВРЕМЯ СУТОК/ однако требование повторно указывать слово "ВРЕМЯ" кажется неразумным. Для того, чтобы избежать этого повторения, используется символ "&". В правой части команды подстановки амперсенд означает "найденный текст", так что можно ввести команду: s/ВРЕМЯ/& СУТОК/ где "&" будет означать "ВРЕМЯ". Конечно, в данном примере экономия будет незначительной, однако если количество символов велико или представляет собой нечто вроде ".*", которому соответствует большой кусок текста, экономится много вводимых символов. Снижается также вероятность совершения ошибки при вводе заменяющего текста. Например, для того, чтобы заключить в скобки строку, независимо от ее длины, можно использовать команду: s/.*/(&)/

Амперсенд может встречаться в правой части команды несколько раз. Команда: s/ВРЕМЯ/& СУТОК И & ГОДА/ построит строку: ВРЕМЯ СУТОК И ВРЕМЯ ГОДА а команда: s/В ЭТО ВРЕМЯ/&? &!!!/ преобразует исходную строку в: В ЭТО ВРЕМЯ? В ЭТО ВРЕМЯ!!!

Чтобы получить настоящий символ "&", используется обратная дробная черта для отмены его специального значения. Команда: s/амперсенд/\&/ заменит слово "амперсенд" на символ "&". Обратите внимание на то, что символ "&" является специальным только в правой части команды, в левой части он не имеет специального значения.



Чтение файла



6.5. Чтение файла









Дополнительные возможности



6.17. Дополнительные возможности









Команда отмены редакции (u)



6.9. Команда отмены редакции (u)

В некоторых случаях обнаруживается, что внесенные изменения не были необходимы или оказались неверными. Команда отмены редакции может быть использована для приведения только что измененной строки в ее исходное состояние: u<CR>

Например, команда u полезна для восстановления текста, случайно вами удаленного. Если вы удалили все строки в файле и затем ввели команду "p", редактор ed ответит "?", что означает, что в файле нет ничего. Воспользуйтесь командой u для восстановления текста. Экран будет выглядеть следующим образом: 1, $p<CR> This is the first line. This is the middle line. This is the last line. 1, $d<CR> p<CR> ? u<CR> p<CR> This is the last line.

Примечание. Команда u не может быть использована с командой w или q.



Команда поиска контекста



6.11. Команда поиска контекста

Эта команда предназначена для поиска строки, содержащей заданный символ, группу символов или группу слов.









Команда удаления строк (d)



6.8. Команда удаления строк (d)

Данная команда предназначена для удаления одной или группы строк в буфере редактора.

Формат команды: [n[, k]]d<CR> где n, k - номера начальной и конечной удаляемых строк.

Команде "d" может предшествовать один или два номера строки. Если номер не задан, то редактор удаляет текущую строку.

Если задан номер только одной строки, то удаляется указанная строка, текущей становится строка, следующая за удаленной.

Если задано два номера строки, то удаляются все строки в указанном интервале от n до k включительно. Текущей строкой всегда становится строка, следующая за последней удаленной строкой, кроме случая, когда удаляется последняя строка буфера. В этом случае текущей станет последняя строка буфера.

Пример. 4, $d удаление из буфера строк с 4-й по последнюю включительно. В буфере после выполнения команды останется 3 первых строки. Текущей строкой станет третья строка буфера.



Команда вставки строк (i)



6.12. Команда вставки строк (i)

Данная команда используется для вставки в текст строк, вводимых с терминала.

Формат команды: [n]i<CR> где n - номер строки в буфере редактора, перед которой надо вставить новые строки.

Если "n" отсутствует, то строки вставляются перед текущей строкой.

Ввод новых строк с терминала завершается символом "." в первой позиции.

Текущей строкой после выполнения командыы "i" становится последняя вставленная строка.

Пример использования команды "i" для вставки 3-х строк перед 7-й строкой:

Пример. 7i<CR> строка 1<CR> строка 2<CR> строка 3<CR> .<CR>



Команда замены (s)



6.10. Команда замены (s)

Команда замены "s" предназначена для изменения отдельных слов или символов в пределах одной строки или группы строк.

Общий формат команды: [n[, k]]s/x/y/[команда]<CR> где x - группа символов или слов в строке, которые надо заменить (старый текст);
y - группа символов или слов, которые заменяют старое значение, указанное как "x" (новый текст);
n, k - номера начальной и конечной строк буфера, в пределах которых осуществляется замена;
/команда - одна из следующих 4-х команд:
g - заменить каждое появление группы символов (x) в каждой указанной строке;
l - отобразить последнюю строку замененного текста, включая непечатаемые символы;
n - отобразить последнюю строку замененного текста, вместе с номерами строк;
p - отобразить последнюю строку замененного текста.

Если номера строк не указаны, замена осуществляется в текущей строке.

Если указан номер только одной строки, то замена производится только в одной строке.

Для реализации замены в группе строк надо указать номера начальной (n) и конечной (k) строк, в пределах которых надо произвести замену.

При выполнении данной команды редактор просматривает строки, начиная с номера "n" и кончая номером "k" включительно. При обнаружении в какой-либо из них искомой группы "x" редактор заменяет ее на "y".

Редактор не печатает результат замены автоматически, поэтому для контроля рекомендуется вместе с командой замены задавать команду печати.

Если в командной строке указаны "n" и "k" и команда печати, то печатается только последняя измененная строка.

Текущей строкой после выполнения команды замены остается последняя строка, в которой произведена замена части текста.

Пример. 1, $s/a/a2/p замена символа "a" на "a2" производится в строках с 1-й по последнюю. Текущей станет последняя строка, она будет распечатана.

Используя команду "s", можно удалить группу символов (или один символ) в строке. Для этого команда замены должна быть задана следующим образом: s/x// что фактически означает: заменить группу символов в текущей строке на "пусто", т.е. просто удалить заданные символы из строки.

Команда "s" заменяет лишь первую найденную искомую группу символов в строке. Если же надо заменить все случаи появления заданной комбинации символов в строке, используется команда "g": s/x/y/g Примеры. s/c/d/gp все появления символа "c" в текущей строке заменить символом "d" и распечатать строку; 1, $s/c/d/gp замена всех символов "c" на символ "d" во всем буфере с печатью последней измененной строки.

В следующем примере содержится ошибка ввода. Пока строка, содержащая ошибку является текущей, произведите корректировку в ней. Старый текст: "ai" в слове "airor", новый текст - "er". Экран выглядит следующим образом:

Пример. a<CR> In the beginning, I made an airor.<CR> .<CR> .p<CR> In the beginning, I made an airor.<CR> s/ai/er/<CR>

Обратите внимание, что ed не дает ответа на команду замены. Чтобы проверить, что команда выполнилась успешно, выполните команду "p" или "n" как часть командной строки замены. .lin В следующем примере команда "n" используется для проверки того, что слово "file" заменит слово "toad".

Пример. .p<CR> This is a last toad s/toad/file/n<CR> 1 This is a last file

Чтобы заменить текст в строке, отличной от текущей, укажите номер строки.

Например, на следующем экране командная строка включает номер строки, которая будет изменена (строка 1), т.к. текущей является строка 3.

Пример. 1, 3p<CR> This is a past toad testing testing come in toad .<CR> come in toad 1s/past/test<CR> This is a test toad

Как вы видите, ed напечатал последнюю строку автоматически после изменения, т.к. последний ограничитель опущен.

Наиболее универсальным средством ed является глобальная замена. Поместив команду "g" после последнего ограничителя в командной строке замены, вы сможете заменить каждое появление шаблона в каждой указанной строке. Заменим строку "es" на "ES": u<CR> 1, $p<CR> This is a last toad testing testing come in toad testing 1, 2, 3 1, $s/es/ES/g<CR> This is a last toad tESting tESting come in toad tESting 1, 2, 3

Другой способ - это использование глобального шаблона для поиска вместо указания границ строк: u<CR> 1, $p<CR> This is a test toad testing testing come in toad testing 1, 2, 3 g/test/s/es/ES/g<CR> 1, 3p<CR> This is a tESt toad tESting tESting come in toad tESting 1, 2, 3 Рассмотрим следующие шаблоны: /шаблон<CR> ?шаблон<CR> v/шаблон<CR>

В следующем примере формат поиска v/шаблон используется для нахождения строк, которые не содержат шаблон "testing". Затем команда "s" используется для замены шаблона "in" на шаблон "out" в этих строках: v/testing/s/in/out<CR> This is a test toad come out toad



Команда замены строк (c)



6.13. Команда замены строк (c)

Команда используется для замены строки или группы строк в буфере редактора.

Формат команды: [n[, k]]c<CR> где n, k - номера начальной и конечной заменяемых строк.

По данной команде редактор удаляет строки с номерами от "n" до "k" включительно и заменяет их строками, вводимыми с терминала после команды "c".

Ввод новых строк завершается символом "." в первой позиции и <CR>.

Если в команде указан номер одной строки, заменяется одна строка.

Если номер строки не указан, то заменяется текущая строка.

Пример замены строк с ".+1" по последнюю.

Пример. .+1 $c<CR> ... строки текста ... .<CR>

Строки, которые вводятся между командами "c" и ".", займут место исходных строк между начальной строкой и конечной строкой. Это наиболее удобно при замене строки (или нескольких строк), содержащих ошибку.



Краткий обзор команд



6.19. Краткий обзор команд

В общем случае команды редактора ed состоят из имени команды, которому могут предшествовать один или два номера строк, и после которого для команд "e", "r" и "w" может указываться имя файла. В строке может присутствовать только одна команда, однако команда "p" может следовать после любой другой команды, кроме "e", "r", "w" и "q". a - Дописать строки в буфер редактора после текущей строки, (если не задана другая строка). Дозапись продолжается до тех пор, пока не будет введена команда ".<CR>". Текущей становится последняя дописанная строка. В этой команде допускается адрес "0", при этом текст помещается в начало буфера.

c - Заменить указанные строки новым текстом, следующим после команды "c". Ввод новых строк завершается ".<CR>". Если номера строк в команде не указаны, заменяется текущая строка. Текущей становится последняя замененная строка или (если строк замены не было) строка, предшествующая удаленным строкам.

d - Удалить указанные строки. Если номера строк не заданы, удаляется текущая строка. Текущей становится первая неудаленная строка, кроме случая, когда удаляется последняя строка буфера. В этом случае текущей становится новая последняя строка буфера.

e - Релактирование нового файла. Предшествующее содержимое буфера теряется, так что предварительно полезно ввести команду "w". Текущей становится последняя строка буфера.

E - Команда выполняет те же действия, что и "e", за исключением того, что не выдается сообщение, если после последнего изменения буфера не была выдана команда записи "w".

f - Выдать текущее имя файла. Если после команды "f" указывается имя файла, текущее имя файла будет заменено этим именем.

g -Конструкция "g/re/команды" выполняет указанные "команды" над теми строками, которые соответствуют образцу "re".

i - Вставить строки перед указанной строкой (или строкой, определяемой точкой). Вставка завершается командой ".<CR>". Текущей становится последняя вставленная строка.

j - Объединить указанные строки в одну строку. Если строки не указаны, объединяются текущая и следующая за ней строки.

k - Отметить строку (указанную или текущую) маркером, задаваемым псле "k". В качестве маркера используются строчные латинские буквы.

l - Распечатать строки. Команда "l" эквивалентна команде "p", однако она распечатывает графически не отображаемые символы и "сворачивает длинные строки".

m - Поместить указанные строки после строки, задаваемой после "m". Текущей становится последняя перемещенная строка.

p - Выдать указанные строки. Если строки не указаны, распечатывается текущая строка. Отдельный номер строки эквивалентен команде "(номер_строки)p". Простое нажатие клавиши <CR> распечатывает следующую строку.

q - Выход из редактора. Если при этой операции теряется информация (например, копия исходного файла изменялась, но не была выдана команда записи "w"), после первой команды "q" выдается подсказка "?" и никаких действий не производится. Выдача подряд двух команд "q" без предварительной команды "w" приводит к стиранию буфера и окончанию работы с редактором.

Q - Работает также как команда "q" за исключением того, что выход производится немедленно (без какой-либо диагностики о возможной потере информации).

r - Прочитать файл в буфер (в конец буфера, если не указано по-другому). Текущей становится последняя считанная строка.

s - Команда s/xxx/yyy/ подставляет вместо символов "xxx" символы "yyy" в указанных строках. Если строки не указаны, подстановка выполняется в текущей строке. Текущей становится последняя строка, в которой произошла подстановка, это приводит к сохранению исходного положения, если не была выполнена ни одна подстановка. Команда "s" заменяет только первое вхождение "xxx" в строке. Для замены всех вхождений после завершающей дробной черты указывается символ "g".

t - Скопировать указанные строки после строки, задаваемой после "t". Текущей становится последняя скопированная строка.

u - Аннулировать изменение, выполненное предшествующей командой.

v - Конструкция "v/re/команды" выполняет указанные "команды" над теми строками, которые не соответствуют образцу "re".

w - Записать буфер в файл. Значение указателя текущей строки не изменяется.

W - Аналогична команде "w", за исключением того, что указанные строки дописываются к файлу.

x - Работа в режиме шифрации. Запрашивается ключ, используя который последующие команды "r", "е" и "w" будут зашифровывать и расшифровывать текст. Пустой ключ отменяет режим шифрации.

.= - Выдать текущий номер строки (один символ "=" печатает номер последней строки).

! - Конструкция "!командная_строка" вызывает выполнение "командной_строки" интерпретатором команд.

/re/ - Контекстный поиск. Поиск следующей строки, которая содержит данную последовательность символов, и ее выдача. Текущей становится строка, соответствующая заданному образцу "re". Поиск начинается со строки ".+1" до "$", после последней строки переходит к строке 1 и, при необходимости, продолжается до текущей строки.

?re? - Контекстный поиск в обратном направлении. Поиск начинается со строки 1 и продолжается до последней строки.

. (точка) - Обозначение текущей строки.

$ - Обозначение последней строки.

'x - Обозначение строки, ранее отмеченной маркером "x".



Печать текста



6.6. Печать текста









Просмотр файла



6.7. Просмотр файла

Редактор запоминает последнюю строку, с которой производились какие-либо действия, так что она может использоваться без явного указания номера строки. Ссылка на эту строку производится с помощью символа ".".

Точка обозначает номер текущей строки. Ее можно использовать различными способами. В частности, можно ввести: ., $p это приведет к распечатке всех строк от текущей строки до конца буфера включительно.

Точка наиболее полезна при использовании в комбинациях следующего вида: .+1 (или, что то же самое .+1p) это означает "напечатать следующую строку" и представляет собой удобный способ медленного просмотра буфера. Можно также ввести команду: .-1 (или .-1p) что означает "распечатать строку перед текущей строкой". Это позволяет, при желании, двигаться назад.

Еще одной полезной командой является команда вида: .-3, .-1p которая распечатывает три предшествующие строки.

Необходимо помнить о том, что обе команды печати "p" и "l" изменяют номер текущей строки. Можно в любое время узнать ее значение, введя: .= редактор ответит печатью значения номера текущей строки.









Работа с файлами



6.15. Работа с файлами









Работа со строками



6.14. Работа со строками









Сообщения редактора



6.18. Сообщения редактора

Диагностические сообщения, выдаваемые редактором в процессе работы, крайне лаконичны, это: WRITE ERROR - ошибка записи, связанная либо с отсутствием места на устройстве, либо со сбоем аппаратуры; Entering encrypting mode! - свидетельствует о включении режима шифрования; MEM? - выдается в режиме дозаписи в буфер редактора при достижении предельного размера буфера; ?(file) - при начале работы или после команд "e", "r", "f" означает, что указанный файл (file) отсутствует; после команды "w" - означает, что запись в файл запрещена.

Если при вводе команды зарегистрирована какая-либо другая ошибка, редактор сообщит об этом, выдав символ "?".



Специальные символы



6.16. Специальные символы

Некоторые символы имеют для редактора особое значение. К ним относятся: ".", "\", "$", "*", "[", "]", "^", "&". Эти символы обычно называются метасимволами.









Редактор текстов ed является диалоговой



6.1. Введение

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

ed работает с копией обрабатываемого файла, которая создается в буфере редактора и хранится там в течение всей обработки. Это предохраняет исходный файл от возможных разрушений при совершении грубых ошибок. Сделанные в копии изменения не влияют на исходный файл до тех пор, пока не будет выдана команда записи.

Редактор запоминает имя обрабатываемого файла (первоначально - имя исходного загруженного файла). По желанию пользователя это имя можно заменять для получения новых вариантов файла.

Если размер файла превышает размер буфера редактора, файл приходится делить на части с помощью команды split, редактировать его по частям, а затем снова объединять с помощью команды cat.

Пользователь сообщает редактору, что делать с его текстом, с помощью определенных инструкций, называемых "командами". Команды редактора имеют простую структуру, и в большинстве случаев состоят из одной буквы. Каждая команда печатается на отдельной строке. Иногда перед командой указывается информация о том, какая строка или строки должны подвергаться действию команды. ed не отвечает на большинство команд, не печатает подсказки или сообщения типа "готово".

Все вводимые командные строки должны заканчиваться символом <CR>.


Выход из редактора



6.4. Выход из редактора

Данная команда используется для

завершения редактирования текста и выхода из редактора.

Формат команды: q<CR>

Так как буфер редактора при выполнении команды "q" уничтожается, для сохранения результатов редактирования буфер должен быть предварительно скопирован командой записи "w".

Если после изменения информации не была выполнена команда записи, в ответ на первую команду "q" выдается подсказка "?" и никаких действий не производится. При повторном наборе команды осуществляется выход с уничтожением накопленной в буфере информации.



Вызов редактора



6.2. Вызов редактора

Синтаксис команды: ed [файл]<CR> где файл - имя файла.

Если файл с указанным именем существует, в ответ будет выдано число символов в файле. В противном случае редактор выдает строку "?file".



Запись файла



6.3. Запись файла

Во время работы ed текст находится во временном буфере редактора и, чтобы сохранить его, по концу редактирования необходимо записать содержимое буфера в файл. Для этой цели используется команда записи.

Формат команды: w[файл]<CR> где файл - имя файла, в который требуется произвести запись.

Если имя файла опущено, запись производится в текущий файл. В результате работы команды содержимое буфера будет скопировано в файл (предыдущая информация в файле будет уничтожена) и выдано сообщение о количестве символов в файле. Если в ответ на попытку записи появляется сообщение "?имя_файла", это означает, что запись в данный файл или справочник закрыта.

При записи файла создается копия текста - содержимое буфера не изменяется, так что можно продолжить работу. Рекомендуется время от времени записывать содержимое буфера, т.к. в случае сбоя системы или совершения какой-либо ошибки весь находящийся в буфере текст может быть потерян.



Добавить текст



7.12.1. Добавить текст

Чтобы в файл добавить текст, воспользуйтесь следующими командами:
a - добавить текст после курсора;
A - добавить текст в конце текущей строки.



Перемещение курсора



7.5.1. Перемещение курсора

Клавиши перемещения курсора позволяют вам перемещать курсор по файлу. Курсор можно переместить с помощью следующих клавиш:
h - перемещает курсор на один символ влево;
j - перемещает курсор вниз на одну строку;
k - перемещает курсор вверх на одну строку;
l - перемещает курсор на один символ вправо;

Команды j и k сохраняют позицию курсора на строке. Например, если курсор находился на 17-м символе слева, то когда вы введете команду j или k, то он переместится на новую строку, но будет находиться на 17-м символе. Если символов в новой строке меньше, то курсор переместитcя на последний символ строки.

Примечание. Некоторые терминалы имеют специальные символы управления курсором, помеченные стрелками. Эти стрелки можно использовать вместо клавиш h, j, k, l.

Если перед h, j, k, l поставить число, то курсор передвинется на количество строк/символов, равных числу. Например, если надо передвинуть курсор на 4 строки вверх, введите 4k. Если вы не можете продвинуться дальше в этом направлении, то vi подаст звуковой сигнал и курсор останется на прежнем месте.

Чтобы переместить курсор на 35 строк вниз, введите: 35j

Дополнительно к клавишам h и l можно использовать клавиши SPACEBAR и BACKSPACE для перемещения курсора вправо или влево.
<SPACEBAR> - переместить курсор на один символ вправо;
<nSPACEBAR> - переместить курсор на n символов вправо;
<BACKSPACE> - переместить курсор на один символ влево;
<nBACKSPACE> - переместить курсор на n символов влево;



Перемещение текста



7.16.1. Перемещение текста

Вы можете переместить текст из одного места в буфере редактора vi в другое, удалив строки, а затем поместив их в требуемое место. Удаленный текст сохраняется во временном буфере. Переместите курсор на то место, куда вы хотите поместить текст и нажмите клавишу "p". Удаленные строки будут добавлены ниже текущей строки.

p - поместить содержимое временного буфера после курсора или ниже текущей строки.

Удаленная с помощью команды удаления строка может быть помещена в середине другой строки. Позиционируйте курсор между двумя словами, затем нажмите клавишу "p". Удаленная строка будет помещена после курсора.

Так как временный буфер сохраняет результат только последней команды, то команда "p" должна использоваться сразу же после команды удаления. Команда "p" используется также для копирования текста, помещенного во временный буфер командой "y"



Повторить последнюю команду



7.18.1. Повторить последнюю команду

Команда "." (точка) повторяет последнюю введенную команду. Очень часто она используется с командой поиска.



Позиционирование курсора на символ



7.7.1. Позиционирование курсора на символ

Для позиционирования курсора на символ в строке существуют три способа: переместить курсор вправо или влево до нужного символа; переместить курсор в начало или конец строки; поиск символа на строке.



Прокрутка текста



7.8.1. Прокрутка текста

Четыре команды редактора vi позволяют вам осуществлять прокрутку текста файла. Команды ^f (<CTRL>f) и ^d (<CTRL>d) проводят прокрутку экрана вперед, а команды ^b (<CTRL>b) и ^u (<CTRL>u) - прокрутку экрана назад.



Создание текста в режиме Append



7.4.1. Создание текста в режиме Append

Если вы успешно вошли в редактор vi, то сразу же попадаете в командный режим и vi ожидает ввода ваших команд. Чтобы создать текст необходимо: введите a, чтобы перейти к режиму ввода (не нажимая клавишу RETURN). Теперь вы можете добавить текст к файлу (файл не печатается на экране); введите нужный текст; перейдите на новую строку и нажмите клавишу RETURN.

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



Удаление слов



7.14.1. Удаление слов

Вы можете удалить слово или часть слова с помощью команды d. Переместите курсор к первому удаляемому символу и введите команду dw. Символ, расположенный над курсором и последующие за нми будут стерты. Команда dw удаляет одно слово или знак пунктуации и пробелы, которые следуют за ним. Вы можете удалить несколько слов или знаков пунктуации за один раз, если укажете перед командой соответствующее число. Например, чтобы удалить 3 слова и две запятые, введите команду 5dw.



Удаление текста в режиме ввода текста



7.13.1. Удаление текста в режиме ввода текста

Если вы находитесь в режиме ввода текста редактора vi и хотите удалить символ, воспользуйтесь клавишей BACKSPACE: BACKSPACE - удалить текущий символ (слева от курсора).

Клавиша BACKSPACE перемещает курсор назад в режиме ввода текста и удаляет каждый символ, который курсор переходит. Однако удаленный символ не стирается с экрана пока вы не нажмете клавишу ESCAPE для возврата в командный режим.

Удалить текст вы можете и с помощью следующих ключей:
^w - отменить ввод текущего слова;
@ - удалить на текущей строке весь введенный во время данного режима ввода текст;
^v - удалить специальное значение, если есть, следующих вводимых символов.

Когда вы вводите ^w, курсор возвращается на последнее введенное слово и ожидает на первом символе этого слова. Он не стирает слово с экрана до тех пор, пока вы не нажмете клавишу ESCAPE или не введете новые символы на месте этого слова.



Установка конфирурации терминала



7.2.1. Установка конфирурации терминала

Прежде чем начать работать с редактором vi, необходимо сообщить системе UNIX, какой тип терминала вы используете. Это связано с тем, что программное обеспечение vi по разному исполнимо на разных терминалах.

Каждому типу терминала соответствует кодовое имя, которое распознается системой UNIX.

Чтобы установить конфигурацию вашего терминала, введите: TERM= terminal_name<CR> export TERM<CR> tput init<CR>

В первой строке переменной TERM присваивается конкретное значение (тип терминала). Вторая строка экспортирует это значение; она передает это значение всем программам системы UNIX, выполнение которых зависит от типа используемого терминала.

Команда tput в третьей строке производит установку программного обеспечения для вашего терминала, чтобы он правильно функционировал с системой UNIX.



Восстановление потерянного файла



7.21.1. Восстановление потерянного файла

Если случайно произошло прерывание работы редактора vi, то не производится запись текста из буфера обратно в файл. Но vi сохраняет копию буфера. Когда вы вновь зарегистрируетесь в системе UNIX, вы можете восстановить файл с помощью опции -r. Введите: vi -r filename<CR> Все или почти все изменения, которые вы выполнили до прерывания, вновь появятся в буфере vi, и вы снова сможете продолжить редактирование файла или записать буфер в файл и завершить работу с vi.



Временный возврат к shell



7.19.1. Временный возврат к shell

Когда вы входите в vi, то содержимое буфера заполняет ваш экран, делая невозможным выдачу команд для shell. Однако вам может это понадобиться. Например, вам необходимо будет получить информацию из другого файла для присоединения ее к текущему тексту. Вы можете получить эту информацию, запустив одну из команд shell, которая отображает текст файла на экране. Например, cat или pg. Однако процедура завершения работы с редактором и повторный вход в редактор потребуют времени и сил. Редактор vi предлагает вам два способа временного выхода из редактора для того, чтобы вы могли ввести команды shell (и даже редактировать другие файлы) не покидая сам редактор. Это команды :sh и :!.

Команда :! позволяет вам выйти из редактора и запустить команду shell одной командной строкой. Находясь в командном режиме редактора vi, введите :!. Эти символы будут напечатаны в низу экрана. Сразу же после символа ! введите команду shell. Shell запустит вашу команду, даст вам ответ и напечатает сообщение: Hit return to continue После того, как вы нажмете клавишу RETURN, vi обновит экран и курсор примет свое прежнее положение.

Команда редактора :sh позволяет вам делать то же самое, но ведет по другому себя на экране. Из командного режима редактора vi введите :sh и нажмите клавишу RETURN. Подсказка команды shell появится на следующей строке. Ведите ваши команды после подсказки так, будто бы вы работаете в нормальном режиме с shell. Когда вы будете готовы вернуться к редактору vi, введите ^d или exit. Экран обновит информация из вашего буфера и курсор вновь переместится на прежнее место.

При временном переходе к shell даже изменение справочников не мешает возврату к буферу редактора vi при вводе ^d или exit.



Замена текста



7.15.1. Замена текста

rx - Заменить текущий символ (символ, на который показывает курсор) на x. Эта команда не устанавливает режим ввода текста и, следовательно, нет необходимости нажимать после нее клавишу ESCAPE.

nrx - Заменить n символов на x. После этой команды также не надо нажимать клавишу ESCAPE.

R - Заменяет только те символы, которые введены в режиме ESCAPE. Если будет достигнут конец строки, то эта команда добавит ввод как новый текст.

Например, вы хотите заменить слово acts на ants в следующем предложении: The circus has many acts. Поместите курсор под буквой c в слове acts и введите команду: rn Предложение будет иметь вид: The circus has many ants. Чтобы заменить слово many на 7777, поместите курсор под буквой m в слове many и введите команду: 4r7 Команда r заменит слово many на четыре цифры 7: The circus has 7777 ants.



Изменение конфигурации



7.2.2. Изменение конфигурации

Если вы часто будете использовать редактор vi, то необходимо сделать соответствующие изменения по установке конфигурации терминала в файле .profile. Этот файл должен находиться в вашем собственном справочнике. За более подробной информацией обратетесь к разд. 9, где описывается shell.

Если вы укажете соответствующие установки для вашего терминала в файле .profile, то ваш терминал будет автоматически настраиваться каждый раз при регистрации. То есть строки, приведенные в п. 7.1.1, добавьте в файл .profile.

hlv 2 Установка автоматического возврата каретки

Если вы хотите, чтобы клавиша RETURN отрабатывала автоматически во время вашей работы с редактором vi, создайте файл с именем .exrc в вашем собственном справочнике. В файле .exrc будут содержаться опции, которые управляют средой редактора vi.

Чтобы создать файл .exrc, введите при вызове редактора имя этого файла. Затем в первой строке текста введите спецификацию циклического режима (автоматический возврат каретки). Формат этой опции: : set wm=n<CR> где n - число символов на строке экрана, после которого должен автоматически появляться возврат каретки. Он может стоять только между словами, но не между слогами слова.

Например, если вы хотите, чтобы возврат каретки проставлялся за 20-м символом с правой стороны экрана, введите: : set wm=20<CR>

По окончании запишите содержимое буфера в файл и завершите работу с редактором. В следующий раз, если вы будете работать с vi, то этот файл предоставит вам автоматический возврат каретки.

Чтобы проверить установки и циклический режим для вашего терминала в редакторе vi, введите команду: : set<CR>

Команду set также можете использовать и для создания или изменения опции циклического режима.



Объединение строк



7.18.2. Объединение строк

Команда "j" объединяет строки. Чтобы ввести эту команду, поместите курсор на текущей строке и нажмите клавиши SHIFT и j одновременно. Текущая строка объединяется со следующей строкой.

Например, вы имеете две строки текста: Dear Mr. Smith: Объединим эти две строки в одну. Поместите курсор под любым символом в первой строке и введите команду "j". На экране появится строка: Dear Mr. Smith: Обратите внимание, что редактор vi автоматически ставит пробел между последним словом в первой строке и первым словом второй строки.



Отменить последнюю команду



7.13.2. Отменить последнюю команду

Отменить последнюю введенную команду можно с помощью следующих команд:
u - отменить последнюю команду;
U - восстановить текущую строку в состояние до произведенных изменений.

Если вы случайно удалили строки, то для отмены команды удаления введите команду u. Удаленные строки вновь появятся на экране. Если вы ввели неправильно команду, то введите команду u и неверная команда будет отменена. Команда U будет аннулировать все изменения в текущей строке до тех пор, пока курсор будет находиться на этой строке.

Если вы введете команду u дважды, то вторая команда отменит первую. Например, если вы удалили по ошибке строку и восстановили ее с помощью команды u, то нажав второй раз u, вы вновь удалите строку. Знание этих команд может спасти вас от многих неприятностей.



Перемещение букв



7.16.2. Перемещение букв

Быстрым способом перемещения букв является комбинация команд "x" и "p" (xp). Команда "x" удаляет букву, "p" - помещает ее после следующего символа. Например, в следующем предложении есть ошибка: A line of tetx Поместите курсор под буквой "t" в комбинации "tx" и затем нажмите клавиши "x" и "p". В результате получим: A line of text



Подстановка текста



7.15.2. Подстановка текста

Команда подстановки текста заменяет символы, но затем позволяет вам продолжать ввод текста с того места, где вы нажали клавишу ESCAPE. s - удалить символ, на который указывает курсор и добавить текст. После окончания ввода текста нажмите клавишу ESCAPE;

ns - удалить n символов и добавить текст. После окончания ввода текста нажмите клавишу ESCAPE;

S - заменить все символы в строке.

Когда вы вводите команду s, последний символ в строке символов, который будет заменен, переписывается со знаком $. Символ не стирается с экрана, пока вы не введете на его место новый символ, или не нажмете клавишу ESCAPE.



Позиционирование слов



7.7.2. Позиционирование слов

Редактор vi предполагает, что слово - это строка символов, которая может включать в себя буквы, цифры и символы подчеркивания. В редакторе vi существует 6 команд позиционирования: w, b, e, W, B и E. Команды w, b, e рассматривают любой символ, отличный от буквы, цифры или подчеркивания, как разделитель, означающий начало или конец слова. Пунктуация до или после пустого пространства является разделителем слов. Символ начала или конца строки также является разделителем.

Команды W, B, E рассматривают пунктуатию как часть слова. Слова разделяются пустым пространством, которое состоит из символов пробел, табуляция и новая строка.

Команды позиционирования: w - перемещает курсор к началу следующего слова; nw - перемещает курсор к началу n-го слова; конец строки не останавливает движение курсора. Он продолжает подсчет слов с начала следующей строки; W - игнорирует все знаки пунктуации и перемещает курсор на следующее после пробела слово; e - перемещает курсор на последний символ в следующем слове; E - перемещает курсор на последний символ в слове. Игнорирует все символы пунктуации за исключением пробела. Слова разделяются пробелами; b - перемещает курсор к первому символу предыдущего слова; nb - перемещает курсор к первому символу n-го предыдущего слова. Команда b не останавливается в начале строки и продолжает движение к началу строки; B - используется подобно команде b, за исключением того, что слова разделяются только символами пробел и новая строка. Она рассматривает все другие символы пунктуации как буквы.



Редактирование нескольких файлов



7.21.2. Редактирование нескольких файлов

Если вы хотите редактировать в одном сеансе более одного файла, то введите команду vi, указав имя каждого файла: vi file1 file2<CR> vi ответит, сколько файлов вы будете редактировать.

Например: 2 files to edit После того, как вы отредактировали первый файл, запишите все изменения из буфера в файл file1: :w<CR> Система ответит на эту команду сообщением в низу экрана. В нем она напечатает имя файла, число строк и символов в этом файле. Затем вы можете начать редактировать следующий файл, задав команду: :n<CR> Система в низу экрана сообщит вам имя следующего файла, который вы будете редактировать, и число строк и символов в этом файле.



Удаление параграфов



7.14.2. Удаление параграфов

Чтобы удалить параграф, воспользуйтесь командой: d{ или d} Помните, что вы можете восстановить удаленный текст с помощью команды u.



Удаление текста



7.5.2. Удаление текста

Если вы хотите удалить символ, переместите курсор к этому символу и нажмите x. Перед x может стоять число, которое говорит о том, сколько символов подряд нужно удалить. Редактор vi так корректирует строку, что на месте удаленного символа не остается пустого промежутка или на месте удаленной строки - пустой строки.



Вставить текст



7.12.2. Вставить текст

Чтобы в файл вставить текст, воспользуйтесь следующими командами:
i - вставить текст до курсора;
I - вставить текст в начале текущей строки до первого ненулевого символа.

Для возврата в командный режим, нажмите клавишу ESCAPE.



Выход из режима Append



7.4.2. Выход из режима Append

После того как вы закончили создавать текст, нажмите клавишу ESCAPE, чтобы из режима ввода перейти к командному режиму. Теперь вы можете редактировать текст, который вы создали или записали <a> Create some text<CR> in the screen editor<CR> and return to<CR> command mode.<ESC>

Если вы нажмете клавишу ESCAPE и услышите звуковой сигнал, то это значит, что вы уже перешли в командный режим. Нажатие клавиши ESCAPE в то время, когда вы находитесь в командном режиме, никак не влияет на текст в файле, даже если вы нажмете ее несколько раз.



Запись текста в новый файл



7.19.2. Запись текста в новый файл

Команда "w" позволяет вам создавать файл, копируя строки текста из файла, который вы в данный момент редактируете, в файл, который вы указали. Чтобы создать новый файл нужно указать строку или строки (номера строк) и имя нового файла в командной строке. Общий формат этой команды: :line_number[, line_number]w filename Например, чтобы записать третью строку буфера в файл three, введите: :3w three<CR>

При успешном создании нового файла, редактор vi напечатает следующую информацию: "three" [New file] 1 line, 20 characters Чтобы записать текущую строку в файл, укажите . (точку) как адрес строки: :.w junk<CR>

Создастся новый файл с именем junk. Он будет содержать только текущую строку буфера vi.

Вы можете записать часть буфера в новый файл, обозначив границы строк. Например, чтобы строки с 23-й по 37-ю записать в файл, введите следующую команду: :23,37w newfile<CR>



Добавление текста



7.5.3. Добавление текста

В редакторе vi существует две команды для добавления текста: insert(i) и append(a). Чтобы добавить текст с помощью команды i, переместите курсор в нужное место с помощью клавишей h, j, k, l. Затем нажмите i и введите текст. Введенный вами текст появится на экране слева от символа, на который указывает курсор. Этот символ и все остальные справа от курсора будут передвинуты вправо, чтобы освободить место для вашего нового текста. Редактор vi будет хранить символы, вводимые вами, до тех пор, пока вы не нажмете клавишу ESCAPE. Если необходимо, передвинутые символы будут перенесены на следующую строку.

Таким же образом вы можете использовать команду a. Отличие состоит в том, что новый текст появится справа от символа, к которому подведен курсор.



Изменение текста



7.15.3. Изменение текста

Команда подстановки заменяет символы. Команда изменения заменяет объект текста и затем продолжает добавлять текст с этого места до тех пор, пока вы не нажмете клавишу ESCAPE.

Команда изменения может содержать аргумент text_object. Вы можете заменить символ, слово и так далее на новый текст: ncx - заменить n-ый объект текста типа x (предложение, параграф);

cw - заменить слово или оставшиеся символы в слове на новый текст. Редактор vi печатает знак $, чтобы показать последний символ, который будет заменен;

ncw - заменить n слов;

cc - заменить все символы в строке;

ncc - заменить все символы в текущей строке и n верхних строк;

C - заменить оставшиеся символы в строке от курсора до конца строки; dfn nC заменить оставшиеся символы, начиная от курсора в текущей строке и во всех n верхних строках.

Команда "c" использует знак $, чтобы отметить последний символ, который должен быть замещен. После того как выполнилась команда изменения, вы находитесь в режиме ввода текста и можете вводить любой текст. Тескт будет храниться в буфере, пока вы не нажмете клавишу ESCAPE.

В табл. 13 приведены команды изменения текста.



Копирование текста



7.16.3. Копирование текста

Вы можете копировать одну или несколько строк текста во временный буфер и затем поместить копию этого текста в определенное место в файле. Чтобы поместить текст на новое место, введите команду "y". Команда "y" имеет следующий общий формат: [number]y[text_object] Копирование строк с помощью команды "y" не удаляет их с прежнего места в файле, т.е. вы можете поместить один и тот же кусок текста в нескольких местах.

В табл. 14 приведены способы использования команды "y".



Очистить окно и восстановить текст



7.18.3. Очистить окно и восстановить текст

Если другой пользователь системы UNIX посылает вам собщение с использованием команды write, а вы в это время редактируете с помощью vi, то посланное сообщение появится в вашем текущем окне поверх текста, который вы редактируете. Чтобы восстановить редактируемый текст после того, как вы прочтете посланное сообщение, нужно перейти в командный режим. Если вы находитесь в режиме ввода текста, то нажмите "^l". Редактор vi сотрет сообщение и восстановит окно в том виде, в котором оно было до прихода сообщения.



Открыть строку для текста



7.12.3. Открыть строку для текста

Для открытия строки для текста воспользуйтесь следующими командами:
o - создать текст с начала новой строки, расположенной ниже текущей строки. Вы можете ввести эту команду в любом месте текущей строки;
O - создать текст с начала новой строки, расположенной выше текущей строки. Вы можете ввести эту команду в любом месте текущей строки.

Команды открытия создают строку непосредственно выше или ниже текущей строки и переводят вас в режим ввода текста. Курсор располагается в начале новой строки и ожидает от вас ввода текста.

В табл. 11 приведены команды создания и добавления текста с помощью редактора vi.



Переход к указанной строке



7.19.3. Переход к указанной строке

Вы можете переместить курсор к любой строке в буфере, если введете команду: :n<CR> где n - номер строки в буфере.



Позиционирование курсора на предложение



7.7.3. Позиционирование курсора на предложение

Редактор vi также распознает предложения. В редакторе vi предложение заканчивается знаками !, . или ?. Если эти разделители появляются в середине строки, то за ними должны стоять два пробела, чтобы vi их мог распознать.

Вы можете перемещать курсор от предложения к предложению в файле с помощью команд ( - открывающая скобка и ) - закрывающая скобка. ( - перемещает курсор в начало текущего предложения;

n( - перемещает курсор в начало n-го предложения выше текущего предложения;

) - перемещает курсор в начало следующего предложения;

n) - перемещает курсор в начало n-го предложения, следующего за текущим предложением.



Удаление строк



7.14.3. Удаление строк

Чтобы удалить строку, введите: dd Для удаления нескольких строк укажите перед командой количество удаляемых строк. Например, команда: 10dd сотрет 10 строк.

Если вы удаляете несколько строк, то vi отображает в нижней части экрана сообщение типа: 10 lines deleted

Если ниже текущей строки осталось меньше 10 строк, то прозвучит сигнал и строки не удалятся.



Позиционирование курсора по параграфам



7.7.4. Позиционирование курсора по параграфам

Параграфы распознаются редактором vi, если они начинаются после пустой строки. Если вы хотите перемещать курсор по параграфам, то при создании текста не забудьте в конце каждого параграфа поставить пустую строку. { - переместить курсор в начало текущего параграфа, который ограничивается пустой строкой;

n{ - переместить курсор в начало n-го параграфа, следующего за текущим параграфом;

} - переместить курсор в начало следующего параграфа;

n} - переместить курсор в начало n-го параграфа ниже текущей строки.



Удаление текста после курсора



7.14.4. Удаление текста после курсора

Для удаления всего текста на строке, расположенного после курсора, поместите курсор на первый удаляемый символ и введите: D или d$ Эта команда удаляет текст только на текущей строке.

В табл. 12 приведен список команд для удаления текста.



Удалить остаток буфера



7.19.4. Удалить остаток буфера

Одним из самых простых способов удаления всех строк от текущей строки и до конца буфера является использование команды "d" построчного редактора со специальнымим символами для текущей и последней строк: :.,$d<CR> где .(точка) - обозначает текущую строку;
$ - обозначает последнюю строку.



Заменить нижний регистр на верхний и vice versa



7.18.4. Заменить нижний регистр на верхний и vice versa

Чтобы быстро заменить букву нижнего регистра на букву верхнего регистра, надо поместить курсор под этой буквой и нажать клавишу "~" (тильда). Вы можете заменить несколько букв, нажав столько же раз клавишу "~", либо поставив перед тильдой число требуемых замен.

В табл. 16 приведены специальные команды.



Добавить файл в буфер



7.19.5. Добавить файл в буфер

Чтобы добавить текст из файла ниже указанной строки в буфер редактора, воспользуйтесь командой "r". Например, чтобы перенести содержимое файла data в ваш текущий файл, поместите курсор на то место, где должен стоять текст и введите команду: :r data<CR> Вместо перемещения курсора вы можете указать номер строки. Например, чтобы вставить файл data после 56-й строки в буфере, введите: :56r data<CR>



Позиционирование в окне



7.7.5. Позиционирование в окне

Редактор vi предоставляет вам 3 команды, которые позволяют вам позиционировать курсор в окне. Эти команды должны быть введены на верхнем регистре:
H - переместить курсор к первой строке экрана;
M - переместить курсор к средней строке экрана;
L - переместить курсор к последней строке экрана.

В табл. 9 приведены команды перемещения курсора для позиционирования его на символе, строке, предложении, параграфе или позиционирования на экране.



Провести глобальные изменения



7.19.6. Провести глобальные изменения

:g/pattern/command<CR> - для каждой строки, содержащей pattern выполнить команду command редактора ex. Построчный редактор напечатает све строки, сождержащие pattern; :s/pattern/new_words<CR> - это команда замены. Построчный редактор отыскивает первое появление символов pattern в текущей строке и заменяет его на new_words; :s/pattern/new_words/g<CR> - редактор ex заменяет каждое появление pattern в текущей строке; :g/helix/s//double helix/g<CR> - эта команда осуществляет поиск слова helix. Каждое найденное слово helix заменяется на double helix. Ограничители после команды "s" позволяют не вводить слово helix каждый раз. Команда запоминает слово между ограничителями после команды "g".

В табл. 17 приведены команды построчного редактора, доступные в редакторе vi.



Переместить курсор в начало или конец строки



7.7.1.1. Переместить курсор в начало или конец строки

Переместить курсор на первый или последний символ в строке можно следующим образом:
$ - переместить курсор на последний символ в строке;
0(ноль) - переместить курсор на первый символ в строке;
^ - переместить курсор на первый ненулевой символ в строке.



Поиск символа в строке



7.7.1.2. Поиск символа в строке

Третий способ позиционирования курсора в строке - это поиск указанного символа на текущей строке. Если символ не найден на текущей строке, то появляется звуковой сигнал и курсор остается на прежнем месте. Существуют команды, которые проводят поиск по шаблону. Они будут описаны далее. Здесь приведем 6 команд для поиска внутри строки: f, F, t, T, ;(двоеточие) и ,(запятая). После f, F, t и T вы можете указать символ: fx - осуществляет поиск указанного символа x справа от текущей позиции курсора;

Fx - осуществляет поиск указанного символа x слева от текущей позиции курсора;

tx - осуществляет перемещение курсора вправо на символ до указанного символа x;

Tx - осуществляет перемещение курсора влево на символ до указанного символа x;

; - повторяет предыдущий поиск символа. Команда ; запоминает символ и ищет следующее появление символа в текущей строке;

, - повторяет предыдущий поиск символа, но в обратном направлении. Команда ; запоминает символ и ищет следующее появление символа в текущей строке;



Команда перемещения (знак минус)



7.7.1.3. Команда перемещения: - (знак минус)

Команда - (минус) перемещает курсор на одну строку вверх, позиционируя его на первом ненулевом символе. Чтобы переместить курсор более чем на один символ, укажите пред знаком минус количество строк. Например, чтобы переместить курсор вверх на 13 строк, введите: 13-

Если эти строки находятся выше отраженного экрана, то окно переместится так, чтобы открыть их. Этот способ помогает быстро перемещаться по файлу. Если выше окажется меньше 13-ти строк, то звуковой сигнал подскажет вам, что вы сделали ошибку и курсор останется в своем прежнем положении.



Команда перемещения + (знак плюс)



7.7.1.4. Команда перемещения + (знак плюс)

Команда + (плюс) или <CR> перемещает курсор вниз на одну строку и позиционирует на первый непустой символ. Перед командой + можно указать количество строк, на которое вы хотите переместить курсор. Например, чтобы переместить курсор на 9 строк вниз, введите: 9+

Если некоторые строки расположены ниже текущего экрана, то окно переместится вниз, чтобы открыть их.



Команда ^f



7.8.1.1. Команда ^f

Команда ^f осуществляет прокрутку вперед на одно окно текста, расположенного ниже текущего окна. Редактор vi очищает экран и выводит новое окно. Две последние строки текущего окна отображаются в верхней части нового окна. Если окно дополнено пустыми строками, то они помечаются знаком ~ (тильда)



Команда ^d



7.8.1.2. Команда ^d

Команда ^d осуществляет прокрутку на половину экрана, чтобы отобразить текст, расположенный ниже окна. Если курсор находится на последней строке файла и вы нажмете ^d, то vi подаст звуковой сигнал.



Команда ^b



7.8.1.3. Команда ^b

Команда ^b осуществляет прокрутку экрана назад на полное окно, чтобы отобразить текст, который находится выше текущего экрана. Редактор vi очищает экран и отображает новое окно. В отличие от команды ^f, команда ^b не оставляет в новом окне строки из текущего окна.



Команда ^u



7.8.1.4. Команда ^u

Команда ^u осуществляет прокрутку половины экрана, чтобы отобразить текст, расположенный выше окна. Если курсор достигнет начала файла, то vi подаст звуковой сигнал.



Использование команд построчного редактора



7.19. Использование команд построчного редактора

Редактор vi имеет доступ ко многим командам построчного редактора ex. В этом подразделе обсуждаются некоторые наиболее часто используемые команды.

Команды редактора ex очень похожи на команды редактора ed.

Команды построчного редактора начинаются с символа ":" (двоеточие). После того, как вы введете двоеточие, курсор опускается в низ экрана и отображает двоеточие. Оставшаяся часть команды тоже появляется внизу экрана.









Извлечение и присоединение текста



7.16. Извлечение и присоединение текста

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









Команды удаления в командном режиме



7.14. Команды удаления в командном режиме

Многие команды редактора vi, такие как команды удаления и изменения, предоставляют вам возможность использовать в командной строке команды перемещения курсора. Команды перемещения курсора могут указывать на объект текста: слово, строка, предложение, параграф. В этом случае общий формат команды будет такой: [number][command]text_object Квадратные скобки указывают, что данные компоненты не являются обязательными.

Все команды удаления, выдаваемые в командном режиме сразу же удаляют указанный текст с экрана и оставшуюся часть отображают на экране в обновленном виде.

Команда удаления имеет следующий формат: [number]dtext_object где d - команда удаления;
text_object - объект удаления.









Копирование и перемещение текста с использованием регистров



7.17. Копирование и перемещение текста с использованием регистров

Перемещение и копирование нескольких разделов текста в различные части файла является утомительной работой. Редактор vi предлагает вам использовать так называемые регистры, в которых вы можете хранить текст до тех пор, пока он вам не понадобится. Сохранить текст вы можете либо с помощью команды "y", либо с помощью команды удаления. Использование регистров особенно полезно, если часть текста должна появиться во многих местах в файле. Извлекаемый текст остается в указанном регистре пока вы не завершите работу с ним, либо закончите работу с редактором, либо поместите в этот регистр другой текст.

Общий формат команды: [number]["X]command[text_object] где X - имя регистра, состоящее из одной буквы верхнего регистра. Имени регистра должны предшествовать двойные кавычки.

В табл. 15 приведены команды извлечения и присоединения текста.









Модификация текста



7.15. Модификация текста

Один из способов модификации текста представляют команды удаления и команды ввода текста. Другой способ, с помощью которого вы можете изменить текст, это задать команду, позволяющую одновременно удалять и создавать текст. В редакторе vi существуют 3 основные команды изменения текста: r, s и c.









Начальные установки



7.2. Начальные установки

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









Номера строк



7.10. Номера строк

Каждая строка файла имеет номер, соответствующий ее положению в буфере. Чтобы получить номер конкретной строки, переместите курсор на эту строку и введите команду: ^g

В нижней части экрана команда ^g поместит информацию: имя файла; был ли буфер модифицирован после поледней записи его в файл; номер строки, на которой находится курсор; общее количество строк в буфере.



Переход на указанную строку



7.9. Переход на указанную строку

Команда G позиционирует курсор на указанную строку в окне. Если эта строка не находится в текущем экране, то G очищает экран и отображает окно, содержащее эту строку. Если не указана строка, то команда G перемещает курсор на последнюю строку файла:
G - переместить курсор на последнюю строку в файле;
nG - переместить курсор на строку n.









Перемещение курсора по экрану



7.7. Перемещение курсора по экрану

Ранее вы познакомились с тем, как перемещать курсор с помощью клавишей h, j, k, l, BACKSPACE и SPACEBAR. В этом подразделе приводятся еще несколько команд, которые помогут вам быстро перемещать курсор по экрану. Эти команды выполняются в командном режиме.









Поиск символов по шаблону команды / и ?



7.11. Поиск символов по шаблону: команды / и ?

Для поиска символов по шаблону вы можете использовать команды /, ?, n и N. Эти команды позволяют осуществлять поиск вперед и назад в буфере следующего появления указанного шаблона символов. Команды n и N позволяют вам повторить последний поиск.

Команда / и следующий за ней шаблон (/pattern) ведет поиск вперед по буферу следующего появления символов, указанных в шаблоне и помещает курсор на первый символ из шаблона. Например, командная строка: /Hello world<CR> находит первое появление в буфере слов Hello world и помещает курсор под буквой H.

Команда ? и следующий за ней шаблон (?pattern) ведет поиск в обратном направлении в буфере первого появления символов, указанных в шаблоне и помещает курсор на первый из этих символов. Например, командная строка: ?data set design<CR> находит предыдущее появление в буфере слов data set design и помещает курсор под буквой d в слове data.

Эти команды поиска не выполняют циклически возврат в случае окончания строки во время поиска двух или более слов. Например, если вам надо найти появление Hello world и окажется, что слово Hello находится в конце одной строки, а слово world - первое слово последующей строки, то эти команды не найдут Hello world.

В то же время, эти команды поиска выполняют циклический возврат в конце или начале буфера для продолжения поиска. Например, если вы находитесь почти в конце буфера, а символы, которые соответствуют шаблону в начале буфера, то команда поиска / найдет шаблон.

Команды n и N позволяют повторить предыдущий запрос поиска /pattern или ?pattern:
n - повторить последнюю команду поиска;
N - повторить последнюю команду поиска в обратном направлении.

Команды / и ? не дают вам возможности указать конкретное появление шаблона с помощью числа. То есть, вы не можете, например, запросить поиск 3-го появления шаблона, начиная с текущей позиции.

В табл. 10 приведены команды vi для перемещения курсора с помощью прокрутки текста, указания номера строки и поиска по шаблону.









Позиционирование курсора на неотображаемом тексте



7.8. Позиционирование курсора на неотображаемом тексте

В этом подразделе описывается, как переместить курсор на текст, который не отображен на текущем экране. Вы можете сделать это следующим образом: прокрутка вперед и назад файла; перейти к указанной строке в файле; поиск по шаблону в файле.









Редактирование текста в командном режиме



7.5. Редактирование текста в командном режиме

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









Режимы редактора



7.4. Режимы редактора

Редактор vi функционирует в двух режимах: режим ввода и командный режим. В режиме ввода вы можете добавлять и модифицировать текст; в командном режиме вы можете: редактировать и изменять существующий текст; удалять, перемещать и копировать текст; передвигаться по всему файлу; выполнять другие задачи.









Создание файла



7.3. Создание файла

Чтобы создать файл, введите: vi filename<CR> Когда вы введете команду vi с именем файла, vi очистит экран и отобразит окно, в которое вы можете вводить и редактировать текст.



Создание текста



7.12. Создание текста

Три основные команды позволяют в редакторе vi создавать текст:
a - добавить текст;
i - вставить текст;
o - открыть новую строку, на которой может быть введен текст.

После того, как вы создали текст с помощью одной из этих команд, можете возвратиться в командный режим редактора vi нажав клавишу ESCAPE.









Специальные команды



7.18. Специальные команды

В этом подразделе приведены специальные команды, которые будут вам весьма полезны:
. - повторить последнюю команду;
j - объединить две строки;
^l - очистить экран и вновь отобразить его;
~ - заменить нижний регистр на верхний и vice versa (?).









Специальные опции для vi



7.21. Специальные опции для vi

Команда vi имеет специальные опции. Они позволяют: восстановить потерянный файл, если работа vi была прервана; поместить в буфер редактирования несколько файлов и редактировать их по порядку; просмотр файла без риска случайного внесения изменений в него.







Основные команды vi



Таблица 8
Основные команды vi

Команды Выполняемые функции
TERM=terminal_name
export TERM
Установка конфигурации терминала
tput init Инициализировать терминал как terminal_name
vi filename Вызов редактора vi для редактирования файла filename
a Добавить текст после курсора
h Перемещает курсор на один символ влево
j Перемещает курсор вниз на одну строку
k Перемещает курсор вверх на одну строку
l Перемещает курсор на один символ вправо
x Удалить символ
<CR> Возврат каретки
<ESC>Перейти из режима ввода в командный режим
:w Записать в файл
:q Завершить работу с редактором
:wq Записать буфер в файл и завершить работу с редактором vi
ZZ Записать изменения в файл и завершить работу с vi



Команды позиционирования курсора



Таблица 9
Команды позиционирования курсора

Команда Действие команды Позиционирование на символ Позиционирование на строку Позиционирование на словоПозиционирование на предложение Позиционирование на параграф Позиционирование в окне
h Перемещает курсор на один символ влево
l Перемещает курсор на один символ вправо
BACKSPACE Перемещает курсор на один символ влево
SPACEBAR Перемещает курсор на один символ вправо
fx Осуществляет поиск указанного символа x справа от текущей позиции курсора
Fx Осуществляет поиск указанного символа x слева от текущей позиции курсора
tx Осуществляет перемещение курсора вправо на символ до указанного символа x
Tx Осуществляет перемещение курсора влево на символ до указанного символа x
; Повторяет предыдущий поиск символа. Команда ; запоминает символ и ищет следующее появление символа в текущей строке
, Повторяет предыдущий поиск символа, но в обратном направлении
j Перемещает курсор вниз на одну строку
k Перемещает курсор вверх на одну строку
- Перемещает курсор на одну строку вверх, позиционируя его на первом ненулевом символе
+ Перемещает курсор вниз на одну строку и позиционирует на первый непустой символ
<CR> Перемещает курсор вниз на одну строку и позиционирует на первый непустой символ
$ Переместить курсор на последний символ в строке
0(ноль)Переместить курсор на первый символ в строке
^ Переместить курсор на первый ненулевой символ в строке
w Перемещает курсор к началу следующего слова
W Игнорирует все знаки пунктуации и перемещает курсор на следующее после пробела слово
e Перемещает курсор на последний символ в следующем слове
E Перемещает курсор на последний символ в слове. Игнорирует все символы пунктуации за исключением пробела
b Перемещает курсор к первому символу предыдущего слова
B Используется подобно команде b, за исключением того, что слова разделяются только символами пробел и новая строка
( Перемещает курсор в начало текущего предложения
) Перемещает курсор в начало следующего предложения
{ Переместить курсор в начало текущего параграфа, который ограничивается пустой строкой
} Переместить курсор в начало следующего параграфа
H Переместить курсор к первой строке экрана
M Переместить курсор к средней строке экрана
L Переместить курсор к последней строке экрана



Дополнительные команды перемещения курсора в редакторе vi



Таблица 10
Дополнительные команды перемещения курсора в редакторе vi

Команда ДействиеПрокрутка Позиционирование с помощью номера строкиПоиск по шаблону
^f Прокрутка экрана вперед на полное окно. Откры- вается новое окно с текстом, расположенным ниже текущего окна
^d Прокрутка текста вниз на пол-окна. Открываются строки, расположенные ниже текущего окна
^b Прокрутка экрана назад на полное окно. Откры- вается новое окно с текстом, расположенным выше текущего окна
^d Прокрутка текста вверх на пол-окна. Открываются строки, расположенные выше текущего окна
1G Перейти к первой строке в файле
G Перейти к последней строке в файле
^g Выдать номер строки и состояние файла
/pattern Поиск вперед в буфере до первого появления шаблона. Курсор помещается на первом символе шаблона
?pattern Поиск назад в буфере до первого появления шаблона. Курсор помещается на первом символе шаблона
n Повторить последнюю команду поиска
N Повторить последнюю команду поиска в обратном направлении



Команды создания текста



Таблица 11
Команды создания текста

Команда Функция
a Создать текст после курсора
A Создать текст в конце текущей строки
i Создать текст перед курсором
I Создать текст перед первым ненулевым символом в текущей строке
o Создать текст с начала новой строки, расположенной под текущей строкой
O Создать текст с начала новой строки, расположенной над текущей строкой
<ESC> Возвратить vi в командный режим из режима ввода текста



Команды удаления текста



Таблица 12
Команды удаления текста

Команда Функция Режим ввода
BACKSPACE Удалить текущий символ
1w Удалить текущее слово
@ Удалить текущую строку нового текста или удалить весь новый текст в текущей строке Командный режим
u Отменить последнюю команду
U Восстановить текущую строку в прежнем состоянии
x Удалить текущий символ
ndx Удалить n-ый объект текста x
dw Удалить слово над курсором и следующий за ним пробел, или знак пунктуации
dW Удалить слово и пунктуацию над курсором с последующим за ним пробелом
dd Удалить текущую строку
D Удалить часть строки справа от курсора
d) Удалить текущее предложение от текущей позиции курсора до конца
d} Удалить текущий параграф от текущей позиции до конца



Команды изменения текста



Таблица 13
Команды изменения текста

Команда Функция
r Заменить текущий символ
R Заменить те символы, которые введены в режиме ESCAPE
s Удалить символ, под которым расположен курсор и добавить текст. Для окончания режима ввода нажмите клавишу ESCAPE
S Заменить все символы в строке
ccЗаменить все символы в строке
ncx Заменить n объектов текста типа x (предложение, параграф)
cwЗаменить слово или оставшиеся символы в слове на новый текст
C Заменить оставшиеся символы в строке от курсора до конца строки



Команда y



Таблица 14
Команда y

Команда Функция
nyx Копирование n-го объекта текста типа x (предложение или параграф)
yw Создание копии слова
yy Создание копии текущей строки
nyy Копирование n строк
y) Создание копии всего текста до конца предложения
y} Создание копии всего текста до конца параграфа

Обратите внимание, что эта команда позволяет указывать номер объекта текста, который будет копироваться.



Команды извлечения и присоединения текста



Таблица 15
Команды извлечения и присоединения текста

Команда Функция
p Помещает содержимое временного буфера, полученное с помощью команды y и команд удаления, в текст после курсора
yyСоздает копию строки текста и помещает во временный буфер
nyx Создает копию n-го объекта текста типа x и помещает ее во временный буфер
"xynПомещает копию объекта текста типа n в в регистр с именем x
"xp Помещает содержимое регистра x после курсора



Специальные команды



Таблица 16
Специальные команды

Команда Функция
. Повторить последнюю команду
j Соединить текущую строку со строкой, расположенной ниже
^lОчистить и восстановить текущее окно
~ Заменить нижний регистр на верхний



Команды построчного редактора



Таблица 17
Команды построчного редактора

Команда Функция
: Обозначает, что следующая за ней команда является командой построчного редактора
:sh<CR> Временный возврат к shell для выполнения команд shell
^d Возврат из временного shell в текущее окно vi для продолжения редактирования
:n<CR> Переход к n-ой строке буфера
:x,yw data<CR> Записать строки от номера x до номера y в новый файл data
:$<CR> Переход к последней строке буфера
:.,$d<CR> Удалить все строки в буфере, начиная с текущей и до послед- ней строки
:r shell.file<CR> Вставить содержимое shell.file после текущей строки в буфере
:s/text/new_words/<CR> Заменить первое появление символов text в текущей строке на new_words
:s/text/new_words/g<CR> Заменить каждое появление символов text в текущей строке на new_words
:g/text/s//new_words/g<CR>Заменить каждое появление символов text в файле на new_words



Команды завершения



Таблица 18
Команды завершения

Команда Функция
ZZ Записать буфер в файл, если после последней записи в буфере были сделаны изменения, и завершить работу с vi
:wq<CR> Записать буфер в файл и завершить работу с vi
:w filename<CR>Записать буфер в новый файл filename
:q<CR> и завершить работу с vi
:w! filename<CR> Перезаписать содержимое буфера в уже
:q<CR> существующий файл filename и завершить работу с vi
:q!<CR> Завершить работу с vi без записи буфера в файл, даже если содержимое буфера изменялось
:q<CR> Завершить работу с vi без записи буфера в файл, если буфер не изменялся



Удаление текста



7.13. Удаление текста

Вы можете удалить текст с помощью нескольких команд в командном режиме и небольшой объем в режиме ввода.









Этот раздел посвящен экранному редактору



7.1. Введение

Этот раздел посвящен экранному редактору vi. Редактор vi является мощным средством для создания и редактирования файлов. Он предназначен для работы на видеотерминале и использует окна, посредством которых вы можете просматривать текст файла. Несколько простых команд позволяют вам сделать изменения в тексте, которые очень быстро отображаются на экране. Редактор может отобразить одну или несколько строк текста. Он позволяет вам передвигать курсор в любую точку на экране или в файле, создавать, изменять или удалять текст. Вы можете также использовать некоторые команды построчного редактора, такие как глобальные команды, которые позволяют вам изменять множество появлений некоторой строки символов, используя одну команду. Чтобы двигаться по файлу, вы можете прокручивать текст вперед или назад.

Примечание. Не все терминалы обладают способностью прокрутки текста и поэтому средство прокрутки текста редактором vi зависит от типа используемого терминала.

Редактор vi имеет более 100 команд. В этом разделе описаны основные команды, которые позволят вам использовать vi просто, но эффективно. Особое внимание будет уделено выполнению следующих задач, позволяющих: изменить окружение shell, чтобы установить конфигурацию вашего терминала; сделать доступным автоматический возврат каретки; начать работу с редактором vi, создать текст, исправить ошибки, записать текст в файл и завершить работу; переместить текст внутри файла; разбить и слить текст; использовать специальные команды и сокращения; использовать команды построчного редактора, доступные внутри vi; временно вернуться в shell, чтобы выполнить команды shell; восстановить файл, потерянный из-за прерывания сессии редактирования; редактировать несколько файлов в одной сессии.


Завершение работы c vi



7.6. Завершение работы c vi

Когда вы закончите работу с текстом, необходимо записать содержимое буфера в файл и возвратить управление shell. Для этого нажмите клавишу SHIFT и дважды нажмите Z(ZZ). Редактор сохранил имя того файла, который вы указали в начале сеанса редактирования, и в этот файл перепишет текст из буфера. Обратите внимание, что внизу экрана дается имя файла и количество строк и символов в файле. Затем shell выдает вам подсказку.

Пример. <a> This is a text file.<CR> I am adding text to<CR> a temporary buffer and<CR> now it is perfect.<CR> I want to write this file,<CR> and return to the shell.<ESC><ZZ> - - - - "stuff" [New file] 6 lines, 135 characters $

Вы также можете использовать команды :w и :q редактора vi для записи файла и окончания работы с редактором. Команды редактора начинаются с двоеточия (:) и появляются в последней строке экрана. Команда :w записывает буфер в файл. Команда :q завершает работу редактора и возвращает управление shell. Вы можете ввести эти команды раздельно, или в одной команде :wq

В табл. 8 приведены основные команды, которые вам необходимы для вызова и использования редактора vi.



Завершение работы с редактором vi



7.20. Завершение работы с редактором vi

Пять основных команд могут быть использованы для завершения работы с редактором vi. Команды, которым предшествует ":", являются командами построчного редактора: :wq<CR> - записать содержимое буфера vi в файл, который в данный момент редактируется и завершить работу с vi;

ZZ - записать содержимое буфера, если он изменялся с момента последней записи;

:q<CR> - записать временный буфер в новый файл filename и завершить работу с редактором vi;

:q!<CR> - завершить работу с редактором vi без записи содержимого буфера в файл; не учитываются все изменения, проведенные в буфере;

:q<CR> - завершить работу с редактором vi без записи содержимого буфера в файл. Эта команда работает в том случае, если вы не производили изменений в буфере. В противном случае vi выдаст предупреждающее сообщение о том, что вы должны сохранить буфер или воспользоваться для завершения работы с vi командой :q!<CR>. Что нужно сделать, чтобы дать файлу другое имя? Например, вы хотите записать в новый файл junk. Введите команду: :w junk<CR> Затем завершите работу с vi: :q<CR>

Если вы попытаетесь записать в уже существующий файл, то получите предупреждающее сообщение. Например, если вы попытаетесь записать в файл johnson, система выдаст сообщение: "johnson" File exists - use "w!johnson" to overwrite

Если вы хотите заменить содержимое существующего файла на содержимое буфера, то воспользуйтесь командой ":w!": :w! johnson<CR>

В табл. 18 приведены команды завершения работы с редактором vi.