Главная » Программирование для UNIX » Краткое описание «Стандартного»  редактора UNIX

0

«Стандартным» редактором UNIX  является ed,  который изначально был написан Кеном  Томпсоном (Ken Thompson). Он была  разработан в начале  семидесятых годов  в качестве  вычислительной среды  малых машин (в первой системе UNIX  программа пользователя не могла превышать 8 Кбайт) с чрезвычайно медленными консолями (10–15 симво лов  в секунду).  Основой  для ed послужил ранее  существовавший редактор qed, в свое время пользовавшийся популярностью.

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

Зачем же тогда  тратить время на устаревшую программу? Дело в том, что хотя ed и стар, но некоторые вещи  он делает по-настоящему хорошо. Он доступен во всех системах UNIX, так  что не нужно беспокоиться при  переходе с одной  системы на другую. Он хорошо работает в условиях низкоскоростного телефонного соединения и с любыми видами терминалов. Программу ed несложно запустить из скрипта; многие же экранные редакторы полагают, что они управляют терминалом, и не могут забирать входные данные из файла.

В ed существуют регулярные выражения для  задания шаблонов. Вся система пронизана регулярными выражениями, образованными из регулярных выражений ed: в grep и sed они практически идентичны; eg– rep, awk и lex расширили их; оболочка использует другой синтаксис, но те же  идеи  для задания шаблонов имен  файлов. У некоторых экранных  редакторов есть  «строковый» режим работы, который  является версией ed, и в нем можно применять регулярные выражения.

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

Основы

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

Каждая команда ed  обозначается одним  символом, обычно   буквой. Бoльшая часть команд допускает задание перед  именем команды одного или  двух  номеров строк, которые показывают, к каким строкам должна быть  применена команда; если  номер  не задан, используется значение по  умолчанию. Номер  строки может определяться ее абсолютным местоположением в файле (1, 2,  …), условным обозначением, таким как $ для  последней строки и . для  текущей, можно осуществить поиск по шаблону с помощью регулярных выражений, а можно использовать аддитивную комбинацию перечисленных способов.

Давайте посмотрим, как создать файл с  помощью ed,  сделаем это  на примере стихотворения Де Моргана (De Morgan) из главы 1.

$ ed poem

?poem                              Предупреждение: файл  poem  не существует

a                                     Добавляем строки

Great  fleas  have  little  fleas upon  their  backs  to  bite  ‘em,

And little  fleas  have  lesser  fleas, and so  ad  infinitum.

.                   Вводим “.” для  остановки добавления

w  poem                                    Запись строк в файл poem

q                                     Выход

$

Команда a добавляет строки или  дописывает их в конец файла; режим дозаписи заканчивается строкой, содержащей лишь точку «.». Никакого  указания на режим, в котором вы работаете, нет, поэтому поста райтесь избегать  двух  наиболее распространенных  ошибок:  вводите текст только после  команды a и вводите новые  команды только после  ввода точки.

Программа ed никогда не записывает текст в файл автоматически, надо сказать ей,  чтобы она это сделала, для  этого введите команду w. Если  пользователь пытается выйти из  программы, не  записав изменения,  ed  выводит  ? в  качестве предупреждения.  Если  в  этот  момент ввести еще  одну  команду q, будет осуществлен выход без сохранения

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

$ ed poem

121                                 Файл существует, в нем 121 символ a                                      Дописать несколько строк в конец And the  great  fleas  themselves, in  turn,

have  greater  fleas  to  go  on;

While these  again  have  greater  still, and  greater  still, and  so  on.

.                   Вводим точку для  остановки ввода

q                                     Попытка выйти

?                                      Предупреждение: изменения не записаны

w                                                     Имя файла не указано, предполагается, что это poem 263

q                                     Теперь можно выходить

$ wc poem                     Проверим

8         46        263  poem

$

Выход в оболочку с помощью команды !

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

!:

$ ed poem

263

!wc  poem

Запустить  wc, не выходя из ed

8

46

263 poem

!

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

q

Можно выйти, не выполняя w: изменений не было

$

Печать

Строки файла пронумерованы 1, 2,  …; можно напечатать n-ю строку, введя команду np или просто  номер  n; чтобы  вывести строки с m-й  по n-ю, введите m, np. Номер последней строки обозначается символом $, так что не приходится пересчитывать строки.

$                                     Вывести последнюю строку, аналогично  $p 1,$p                                Напечатать строки с 15й по последнюю

Можно построчно вывести файл, просто нажимая Return; можно вернуться на строку назад, введя –. Номера строк можно комбинировать при помощи + и –:

$–2,$p                            Напечатать последние три строки

1,2+3p                            Напечатать строки с 15й по 55ю

Но печатать строки в обратном порядке и заходить за конец файла не разрешено; команды вида $,$+1p  и $,1p недопустимы.

Команда l (list – перечень) выводит строки в таком формате, который делает видимыми все символы; это удобно для  поиска в файле управляющих символов, для распознавания пробелов и знаков табуляции и т. д. (см. команду vis в главе 6).

Шаблоны

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

$ ed poem

263

/flea/                    Ищет следующую строку, содержащую flea Great  fleas  have  little  fleas

/flea/                    Ищет следующую строку

And  little  fleas have lesser fleas,

//                     Ищет следующую строку по тому же шаблону

And  the  great fleas  themselves, in  turn,

??                                    Поиск по тому же шаблону в обратном направлении

And  little  fleas have lesser fleas,

Шаблон, использованный последним, ed  запоминает, поэтому поиск можно продолжить, просто  вводя  //. Для поиска в обратном направлении используйте ?шаблон? и ??.

Поиск, осуществляемый с помощью /…/ и  ?…?, выполняется «по кругу», то есть,  дойдя до конца текста, возобновляется с начала, и наоборот:

$p                              Выводит последнюю строку. (p  необязательно)

and  greater  still,  and  so  on.

/flea/                Следующее вхождение flea  находится в начале текста

Great  fleas have little  fleas

??                              Перешагивает через начало текста, выполняя поиск в обратном направлении

have greater fleas to  go on;

Шаблон, такой как /flea/, на самом  деле является таким же  номером строки, как 1 или  $, и поэтому может быть использован соответствующим  образом:

1,/flea/p                Напечатать строки с 1 до следующего вхождения  flea

?flea?+1,$p              Напечатать с предыдущей  flea  +1 до конца

Текущая строка

Редактор ed отслеживает последнюю строку, с которой производились какие-то действия: печать или  добавление текста, или  чтение файла. Такая строка называется текущей строкой и обозначается «.» (точка). Каждая команда воздействует на точку определенным образом, обычно устанавливая ее в последнюю строку, обработанную командой. Точку можно использовать так  же, как $ или  обычный номер строки, например 1:

$ ed poem

263

.                   Вывести текущую строку, аналогично $ после прочтения

and greater still, and so  on.

.-1,.p                    Вывести предыдущую и данную строки

While these  again  have  greater  still, and  greater  still, and  so  on.

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

Краткая запись:

То же самое :

Краткая запись:

То же самое:

.–1

+

.+1

–– или –2

.–2

++ или +2

.+2

n

.– n

+ n

.+ n

$–

$–1

.3

.+3

Добавление, удаление, изменение и вставка

Команда a (append) добавляет строки после указанной строки; команда d (delete) удаляет  строки; команда i (insert) вставляет строки  перед  указанной строкой; команда c (change) изменяет строки, являясь комбинацией вставки и удаления.

na                     Добавить текст после строки n ni              Вставить текст перед строкой n m, nd              Удалить строки с m по n

m, nc               Изменить строки с m по n

Если  номера строк не указаны, используется точка. Новый текст для  команд a, c и i заканчивается строкой, состоящей из символа «.»; при  этом  точка устанавливается в  последнюю добавленную строку. При  удалении  точка устанавливается в строку, следующую  за  последней удаленной, но за последнюю строку $ она не переходит.

0a                          Добавить текст в начало (аналогично 1i)

dp                          Удалить текущую строку, вывести следующую (или последнюю, если в  $)

.,$dp                     Удалить с этого места до конца, вывести новую последнюю строку

1,$d                       Удалить все

?pat?,.–1d           Удалить с предыдущего «pat» до строки перед точкой

$dp                        Удалить последнюю строку, вывести новую последнюю строку

$c                          Изменить последнюю строку. ($a  добавляет после последней строки)

1,$c                       Изменить все строки

Замена и отмена

Было бы слишком мучительно вводить заново целую строку для того,  чтобы  изменить в ней всего несколько букв. Команда s (substitute) заменяет одну буквенную строку другой:

s/old/new/          Заменить первую old  на  new  в текущей строке s/old/new/p          Заменить первую old  на  new и напечатать строку s/old/new/g       Заменить каждую  old на  new в текущей строке s/old/new/gp        Заменить каждую old  на  new и напечатать строку

Заменяется лишь самое  левое  вхождение, соответствующее шаблону, на строке, если только в конце команды не указано «g». Команда s не выводит измененную строку, если  только в конце команды не  стоит

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

Если замена не привела к ожидаемому результату, то команда u (undo) может аннулировать последнюю замену. Точка должна быть  установлена  в замененную строку.

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

up                          Отменить последнюю замену и вывести

Как и команды p и d, s допускает указание перед именем команды одного или двух номеров строк, на которые команда должна воздействовать:

/old/s/old/new/        Найти следующую old; заменить на  new

/old/s//new/             Найти следующую old; заменить на  new

(шаблон запоминается)

1,$s/old/new/p        Заменить первую old  на new в каждой строке; вывести последнюю измененную строку

1,$s/old/new/gp      Заменить каждую old  на  new в каждой строке; вывести последнюю измененную строку

Обратите внимание, что 1,$s применяет команду s к каждой строке, но все равно  означает только самое  левое  совпадение в каждой строке; а замыкающее g заменяет все вхождения во всех строках. Кроме того, p выводит только последнюю обработанную строку; для  того чтобы вывести  все измененные строки, нужна глобальная команда, о ней будет рассказано позже.

Символ &  используется для  краткости записи;  если  он  появляется в любом  месте  с правой стороны команды s, то заменяется тем,  соответствие чему задано в левой  части:

s/big/very &/      Заменить big  на  very  big s/big/&  &/           Заменить  big  на  big  big

s/.*/(&)/           Заключить в круглые скобки всю строку (см. .* ниже) s/and/\&/           Заменить  and на  &   (\ аннулирует специальное значение)

Метасимволы и регулярные выражения

В оболочке есть символы со специальным значением, такие как *, > и

|, есть подобные символы и в ed, здесь они появляются в шаблонах поиска или  в левой части команды s. Такие символы называются мета5 символами, а использующие их  шаблоны – регулярными выражения5  ми. Символы и их значения перечислены в табл. 1; разбирая примеры, приведенные ниже, обращайтесь к таблице. Специальное значение некоторых символов отменяется, если им предшествует символ обратной косой  черты.

Таблица 1. Регулярные выражения редактора

Символ

Значение

c

\c

^

$

.

[…] [^…] r*

&

\(…\)

любой неспециальный символ c соответствует сам себе отменяет специальное значение символа c

соответствует началу строки, если шаблон начинается с ^ соответствует концу строки, если шаблон заканчивается $ соответствует любому отдельному символу

соответствует любому из символов в …; разрешены диапазоны типа  a–z

соответствует любому из символов, не входящих в …; разрешены диапазоны

соответствует нулю  или более  вхождений r, где r – это символ, точка или […]

только в правой части команды s; порождает то, чему ищется соответствие

регулярные выражения  с  тегами;  соответствующая строка  доступна как \1 и т. д., как с правой, так  и с левой стороны

Шаблон:                            Соответствие:

/^$/                              пустая строка, т. е. только разделитель строк

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

/^/                           все строки

/thing/                              thing в любом месте строки

/^thing/                             thing в начале строки

/thing$/                             thing в конце строки

/^thing$/                          строка, которая содержит только thing

/thing.$/                           thing и еще один символ в конце строки

/thing\.$/                       thing.  в конце строки

/\/thing\//                     /thing/ в любом  месте строки

/[tT]hing                           thing или Thing  в любом месте строки

/thing[0–9]/                           thing, затем одна цифра

/thing[^0–9]/                         thing, затем не цифра

/thing[0–9][^0–9]/               thing, затем сначала цифра, потом не цифра

/thing1.*thing2/                thing1, затем любая строка, затем thing2

/^thing1.*thing2$/               thing1   в начале и  thing2   в конце

Регулярные выражения, содержащие символ *, выбирают самое левое  соответствие и  продолжают его как можно дальше. Обратите  внимание на то, что x* может соответствовать нулю  символов, а xx* соответ ствует одному  или более символам.

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

Глобальные команды g и v применяют одну или несколько других команд к множеству строк, заданному регулярным выражением. Команда g чаще всего  применяется для печати, замены или  удаления множества строк:

m,ng/re/cmd          Выполнить cmd  для всех строк между m и n, соответствующих re

m,nv/re/cmd          Выполнить cmd  для всех строк между m и n, не соответствующих re

Команде g или  v могут  предшествовать номера  строк, ограничивающих диапазон применения; по умолчанию принят 1,$.

g/…/p                  Вывести все строки, соответствующие регулярному  выражению …

g/…/d                  Удалить все строки, соответствующие …

g/…/s//repl/p            Заменить первое вхождение на каждой строке на «repl», вывести измененные строки

g/…/s// repl/gp          Заменить каждое вхождение на «repl», вывести

измененные строки

g/…/s/pat/ repl/       На строках, соответствующих , заменить первое

«pat» на «repl»

g/…/s/pat/ repl/p    На строках, соответствующих , заменить первое

«pat» на «repl» и вывести

g/…/s/pat/ repl/gp    На строках, соответствующих , заменить все

«pat» на «repl» и вывести

v/…/s/pat/ repl/gp    На строках, не соответствующих , заменить все

«pat» на «repl» и вывести

v/^$/p                        Вывести все непустые строки

g/…/cmd1\                 Чтобы выполнить несколько команд с одной  g, cmd2\                            добавьте \ в конец каждой cmd

cmd3                          кроме  последней

Команды, управляемые глобальной командой g или  v, тоже  могут  использовать номера строк. Точка устанавливается по очереди в каждую выбранную строку.

g/thing/.,.+1p                           Вывести каждую строку с  thing и следующую

g/^\.EQ/.1,/^\.EN/–s/alpha/beta/gp      Заменить  alpha  на  beta  только между  .EQ и  .EN, и вывести измененные строки

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

Команда m перемещает группу последовательных строк; команда t создает копию группы строк в каком-то другом месте.

m,nm  d               Перемещает строки с m по n в положение после строки d m,nt  d               Копирует строки с m по n в положение после строки d

Если  исходные строки не указаны, используется точка. Строка назначения не может находиться в диапазоне m, n51. Приведем характерные способы  применения m и t:

m+                  Переместить текущую строку за следующую (перестановка)

m–2              Переместить текущую строку перед предыдущей

m––            Аналогично, ––  равнозначно –2 m–                 Ничего не происходит

m$             Переместить текущую строку в конец (m0  перемещает в начало)

t.       Продублировать текущую строку (t$  дублирует в конец)

–,.t.    Продублировать предыдущую и текущую строки

1,$t$        Продублировать все множество строк

g/^/m0      Обратный порядок строк

Метки и номера строк

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

Команда kc помечает строку, к которой происходит обращение, буквой c (в нижнем регистре); теперь к этой строке можно обращаться как к ‘c. Команда k не изменяет точку. Метки удобно использовать при перемещении больших частей текста, так  как они привязаны к строкам навсегда:

/…/ka                 Найти строку и пометить ее как  a

/…/kb                 Найти строку и пометить ее как b

‘a,’bp                   Вывести весь диапазон, чтобы быть уверенным

/…/           Найти строку назначения

‘a,’bm.                 Переместить выбранные строки за данную

Объединение, разбиение и перегруппировка строк

Строки можно объединить при  помощи команды j (пробелы не добавляются):

m,nj                       Объединить строки с m по n в одну строку

Диапазон по умолчанию –  .,.+1, так что

jp                           Объединить текущую строку со следующей и вывести

–,.jp                     Объединить предыдущую строку с текущей и вывести

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

s/part1part2/part1\ part2/

Разделить строку на две части

s/ /\

/g

Разделить на каждом пробеле;

получается по одному слову на строке

Точка остается на последней созданной строке.

Чтобы работать с частями соответствующих регулярных выражений, а не с целыми, используйте регулярные выражения с тегами: если  в регулярном выражении  появляется   конструкция  вида   \(…\), то часть  целого, которой она соответствует, доступна как с правой, так  и с левой  стороны как \1. Может быть  задано до девяти регулярных выражений с тегами, на которые ссылаются как на \1, \2 и т. д.

s/\(…\)\(.*\)/\2\1/        Переместить первые 3 символа в конец

/\(..*\)\1/                    Найти строки, содержащие повторяющуюся соседнюю строку

Файловые команды

Команды чтения и записи r и w могут применяться с указанными перед ними номерами строк:

nr file                  Прочитать file; добавить его после строки n; установить точку в последнюю прочитанную строку

m,nw  file             Записать строки m5n в file;  точка не изменяется

m,nW  file             Записать строки m5n в конец file;  точка не изменяется

По умолчанию диапазоном в командах w и W является весь файл. Значением  по умолчанию n в команде r является $, что не очень-то удачно. Будьте внимательны!

Редактор ed запоминает первое   имя   файла,  указанное в  командной строке или в команде r или w. Команда f выводит или изменяет имя  запомненного файла:

f                        Вывести имя  запомненного файла

f file                     Заменить запомненное имя  на «file»

Команда редактирования  e заново  инициализирует ed запомненным или новым файлом:

e                            Начать редактирование запомненного файла

e  file                     Начать редактирование «file»

Команда e обладает тем же свойством, что и q: если сделанные изменения не были  сохранены, то после  первого ввода  e появится  сообщение об ошибке. Команда e реинициализирует вне зависимости от того,  сохранены изменения  или  нет.  В некоторых системах ed и  e связаны ссылкой, поэтому одна и та же команда (e имя5файла) может быть  использована как внутри редактора, так и вне его.

Шифрование

Файлы могут быть зашифрованы при записи и расшифрованы при чтении  с помощью команды x, при  этом  будет запрошен пароль. Шифрование аналогично crypt(1). В некоторых системах команда x была  заменена на X (верхний регистр), чтобы  избежать неумышленного шиф рования.

Сводка команд

Список команд ed представлен в табл. 2, а  разрешенные номера команд – в табл. 3. Каждой команде предшествует ноль, один или два номера  строк, которые указывают, сколько номеров строк можно зада вать, и значения по умолчанию, если  номера не заданы. За  большей частью команд может следовать p, тогда  выводится последняя обработанная строка или l для перечисления строк. Точка обычно  устанавливается в последнюю обработанную строку; команды f, k, w, x, = и ! не изменяют ее.

Упражнение. Когда  вы решите, что знаете ed, опробуйте редактор quiz; см. quiz(6). ~

Таблица 2. Команды редактора

Команда           Действие

.a                     добавляет текст до тех  пор,  пока не будет  введена строка, состоящая из одного символа «.»

.,.c                      изменяет строки; новый текст заканчивается так  же, как и в a

.,.d                      удаляет строки

e file                   реинициализирует для  file. Команда  E  делает это, даже если  изменения не сохранены

f file                   устанавливает запомненный файл в file

1,$g/re/cmds    выполняет команду ed  cmds для каждой строки, соответствующей регулярному выражению re; несколько cmds разделяются \ newline (символ новой строки)

.i             вставляет текст перед строкой, заканчивается так же, как и в a

.,.+1j                  объединяет строки в одну

.kc                       помечает строку буквой c

Таблица 2 (продолжение)

Команда

Действие

.,.l

.,.mline

.,.p q

$r  file

.,.s/re/new/

.,.tline

.u 1,$v/re/cmds

1,$w  file

x

$=

!cmdline

(.+1)newline

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

печатает строки

выход; Q выходит, даже если изменения не сохранены читает file

заменяет на new то, что соответствует re

копирует строки после line

отменяет последнюю замену на строке (только одну) выполняет команду ed cmds для  каждой строки, не соответст-

вующей re

записывает строки в  file;  W   дописывает в  конец вместо  того, чтобы перезаписывать

вход в режим шифрования (или  ed –x имя5файла) выводит номер строки

выполняет команду UNIX  cmdline

выводит строку

Таблица 3. Номера строк редактора

Обозначение

Смысл

n

.

$

/re/

? re? ‘c N1+5n N1,N2

N1;N2

абсолютный номер строки n, n = 0, 1, 2, … текущая строка

последняя строка текста

следующая строка, соответствующая re; переходит с $ на 1 предыдущая строка, соответствующая re; переходит с 1 на $ строка с пометкой c

строка N1± n (аддитивная комбинация)

строки с N1 по N2

устанавливает точку в N1,  затем оценивает N2

N1  и N2  могут  быть  заданы любым из  перечисленных выше способов

Источник: Керниган Б., Пайк Р., UNIX. Программное окружение. – Пер. с англ. – СПб: Символ-Плюс, 2003. – 416 с., ил.

По теме:

  • Комментарии