ED(1) ED(1)
НАЗВАНИЕ
ed - текстовый редактор
СИНТАКСИС
ed [-s] [-p приглашение] [файл]
ОПИСАНИЕ
Текстовый редактор ed является стандартным для UNIX
систем. Если в командной строке задан файл, он считыва-
ется в буфер (как будто была выполнена команда e, см.
ниже) и его можно редактировать.
Опциям команды ed приписан следующий смысл:
-s Подавить печать количества символов при выполнении
команд e, r и w, выдачу диагностики команд e и q и
префикса ! после выполнения конструкции !команда.
-p приглашение
Задать в качестве приглашения свою цепочку симво-
лов.
Редактор ed работает с копией файла; изменения, произ-
водимые над копией, отображаются на файл только после
выполнения команды записи w. Копия текста размещается
редактором во временном файле, называемом буфером. Бу-
фер только один.
Редактор поддерживает спецификацию формата текстового
файла [см. fspec(4)]. Если первая строка редактируемого
файла содержит спецификацию формата, а у терминала, с
которого вызван ed, задана характеристика -tabs или
tab3 [см. stty(1)], то при просмотре файла нужные пози-
ции табуляции будут установлены автоматически. Напри-
мер, если в первой строке файла содержится:
<:t5,10,15 s72:>
то позиции табуляции будут установлены в колонках 5,
10, 15, а максимальная длина строки составит 72. Отме-
тим, что при вводе текста, независимо от спецификации
формата, происходит замена символов табуляции пробелами
до ближайшей колонки, кратной восьми.
Команды ed имеют простую и регулярную структуру: ноль,
один или два адреса предшествуют односимвольной коман-
де, после которой могут располагаться ее аргументы. Ад-
реса задают одну или несколько строк из буфера. Отме-
тим, что каждая команда, требующая адресации, может ад-
ресоваться по умолчанию, то есть адреса указывать не
обязательно.
Как правило, в строке может содержаться только одна ко-
манда. Ряд команд позволяет вводить текст, который раз-
мещается в определенном месте буфера. Когда редактор
находится в режиме ввода, никакие команды не восприни-
маются; вводимая информация только накапливается. Стро-
ка, состоящая из одного символа ".", обозначает конец
ввода.
Редактор ed поддерживает ограниченную форму записи ре-
гулярных выражений; регулярное выражение используется
для задания адресов строк и, в некоторых командах (нап-
ример, s) для указания заменяемых фрагментов строк. Ре-
гулярное выражение (РВ) определяет множество цепочек
символов. Говорят, что элемент множества цепочек удов-
летворяет РВ. РВ для ed может быть построено следующим
образом.
Следующие односимвольные РВ сопоставляются с цепочками
из одного символа:
1.1 Обычный символ (не входящий в перечень из пункта
1.2, см. ниже) - это односимвольное РВ, которое
успешно сопоставляется с указанным символом.
1.2 Если за символом \ следует любой специальный сим-
вол, то этот последний теряет свой специальный
смысл. Данная комбинация определяет односимвольное
РВ, успешно сопоставляющееся со специальным сим-
волом. Специальными символами являются:
. * [ \
Эти символы имеют специальный смысл, за исклю-
чением случая, когда они заключены в квадратные
скобки (см ниже 1.4).
^ Символ имеет специальный смысл в начале всего
РВ (см. ниже 3.1) или в квадратных скобках сра-
зу после открывающей скобки (см. 1.4).
$ Символ имеет специальный смысл в конце всего РВ
(см. ниже 3.2).
разделители РВ
Символы, использующиеся для ограничения (разде-
лители) целого РВ, являются специальными для
этого РВ (например, символ / в команде g).
1.3 Точка (.) - односимвольное РВ, успешно сопоставля-
ющееся с любым символом, кроме перевода строки.
1.4 Непустая цепочка символов, заключенная в квадрат-
ные скобки [ ] - односимвольное РВ, которое успеш-
но сопоставляется с любым символом из этой цепоч-
ки. Если цепочка начинается с символа ^, то РВ ус-
пешно сопоставляется с любым символом, не входящим
в этот набор и отличающимся от перевода строки.
Если символ ^ располагается не в начале цепочки,
он теряет свой специальный смысл. Диапазон симво-
лов можно задать с помощью знака -. Например, РВ
[0-9] эквивалентно [0123456789]. Минус теряет свой
специальный смысл, если он стоит в начале (быть
может, после ^) или в конце цепочки символов. Зак-
рывающая квадратная скобка не рассматривается как
окончание цепочки символов, если она стоит в нача-
ле (быть может, после ^). Таким образом, РВ
[ ]a-f] определяет либо закрывающую квадратную
скобку, либо любой символ от a до f включительно.
Внутри квадратных скобок символы, перечисленные в
1.2, теряют свой специальный смысл.
Для построения РВ из односимвольных РВ могут быть ис-
пользованы следующие правила:
2.1 Односимвольное РВ есть РВ, успешно сопоставляющее-
ся по правилам, описанным выше.
2.2 Односимвольное РВ с последующим символом * есть
РВ, успешно сопоставляющееся с любым (в том числе
и нулевым) числом вхождений односимвольного РВ.
При наличии альтернатив выбирается самая длинная
из начинающихся как можно левее успешно сопостав-
ленных цепочек символов.
2.3 Односимвольное РВ, после которого следуют конст-
рукции \{m\}, \{m,\} или \{m,n\}, есть РВ, успешно
сопоставляющееся с определенным числом вхождений
односимвольного РВ. Значения m и n должны быть не-
отрицательными целыми, меньшими 256; \{m\} означа-
ет ровно m вхождений; \{m,\} - по крайней мере m
вхождений; \{m,n\} - любое число вхождений от m до
n включительно.
2.4 Конкатенация нескольких РВ есть РВ, которое успеш-
но сопоставляется с конкатенацией цепочек симво-
лов, каждая из которых успешно сопоставлена с от-
дельным РВ.
2.5 РВ, заключенное между конструкциями \( и \), есть
РВ, которое успешно сопоставляется с теми же це-
почками символов, что и исходное.
2.6 Выражение \n успешно сопоставляется с той же це-
почкой символов, что и (под)выражение, заключенное
в экранированные скобки \( и \), и расположенное
ранее в том же РВ. Здесь n - это цифра; соответст-
вующее подвыражение начинается с n-го вхождения
конструкции \( в РВ. Например, выражение
^\(.*\)\1$ успешно сопоставляется со строками,
состоящими из двух одинаковых цепочек символов.
Наконец, на РВ можно наложить ограничение, чтобы сопос-
тавленная цепочка символов примыкала к одному или обоим
концам строки:
3.1 Если перед РВ стоит символ ^, то сопоставление
должно выполняться с начала строки.
3.2 Если после РВ стоит символ $, то сопоставление
должно выполняться до конца строки.
Конструкция ^РВ$ задает шаблон целой строки.
Пустое РВ (//) эквивалентно последнему обработанному
РВ.
Для понимания механизма адресации в редакторе ed следу-
ет знать, что в каждый момент времени существует теку-
щая строка. Вообще говоря, текущей является последняя
из строк, обработанных какой-либо командой. Подробнее
вопрос о текущей строке обсуждается при описании каждой
команды. Адреса строятся по следующим правилам:
1. Символ . обозначает текущую строку.
2. Символ $ обозначает последнюю строку буфера.
3. Десятичное число n обозначает n-ую строку буфера.
4. Пара символов 'x адресует строку, помеченную мар-
кером x. Маркер - это малая буква, ставится с по-
мощью команды k (см. ниже).
5. РВ, заключенное между символами /, адресует первую
из строк, успешно сопоставленных с РВ при движении
вперед. Процесс сопоставления начинается со стро-
ки, следующей за текущей. Если до конца буфера
подходящей строки не нашлось, сопоставление про-
должается с начала буфера до текущей строки вклю-
чительно, то есть просматривается весь буфер.
6. Конструкция ?РВ? аналогична предыдущей, только
просмотр выполняется в обратном направлении, начи-
ная со строки, расположенной перед текущей.
7. Если за адресом следует знак + или -, и далее сто-
ит десятичное число, то адрес увеличивается (или
уменьшается) на указанное число строк. Знак + мож-
но опускать.
8. Если адрес начинается с + или -, то смещение про-
изводится относительно текущей строки; так, адрес
-5 эквивалентен .-5.
9. Если адрес оканчивается на + или -, то к адресу
прибавляется (из него вычитается) 1. Согласно это-
му и предыдущему правилу адрес из одного символа
- соответствует строке, расположенной перед теку-
щей. (В более ранних версиях редактора ту же роль
играл символ ^). Более того, последовательности
знаков + или - в конце адреса обладают эффектом
накопления. Так, -- соответствует адресу текущей
строки, уменьшенному на 2.
10. Запятая обозначает пару адресов 1,$, а точка с за-
пятой - пару адресов .,$.
Команды могут требовать ноль, один или два адреса. Ад-
реса указываются перед командами. Задание адресов для
команды, их не требующей, считается ошибкой. Если зада-
но меньше адресов, чем нужно, используются подразумева-
емые значения. Если адресов больше, чем нужно, исполь-
зуются последние.
Обычно адреса отделяются друг от друга запятой. Адреса
могут разделяться и точкой с запятой. В этом случае те-
кущая строка (.) становится первым адресом, и только
тогда вычисляется второй, что можно использовать при
поиске вперед и назад (см. выше правила 5 и 6). Второй
адрес всегда должен быть больше первого (в соответствии
с нумерацией строк буфера).
В следующем ниже списке команд редактора ed в скобках
указаны подразумеваемые адреса. Разумеется, сами скобки
не являются частью адреса.
Обычно недопустимо появление более одной команды в
строке. Однако некоторые команды (такие как e, f, r или
w) могут употребляться с суффиксами l, n или p. В этом
случае текущая строка распечатывается или нумеруется.
Далее эти команды будут обсуждены.
(.)a
текст
.
Команда добавления читает данный текст и вставляет
его после адресуемой строки. Текущей становится
последняя из вставленных строк или, если такой
нет, адресуемая строка. Адрес 0 в данном случае
является корректным и обозначает вставку в начало
буфера. Длина строк текста не должна превышать 256
(включая символ перевода строки).
(.)c
текст
.
Команда изменения уничтожает адресуемые строки и
вместо них вставляет текст. Текущей становится
последняя из вставленных строк или, если такой
нет, первая неудаленная строка.
(.,.)d
Команда удаления уничтожает в буфере адресуемые
строки. Текущей становится строка, следующая за
последней удаленной. Если уничтожаются строки до
конца буфера, то текущей становится последняя из
оставшихся строк.
e файл
Эта команда уничтожает текущее содержимое буфера и
читает новое содержимое из указанного файла. Теку-
щей становится последняя прочитанная строка. Если
имя файла не указано, то используется текущее имя
файла (см. команду f). Количество прочитанных сим-
волов выводится на экран. Файл становится текущим
и может использоваться в последующих командах e, r
и w в качестве подразумеваемого. Если вместо файла
указан символ !, остаток строки рассматривается
как команда shell'а [см. sh(1)], вывод которой
размещается в буфере редактора. Такая команда не
изменяет текущее имя файла.
E файл
Эта команда аналогична команде e, за исключением
того, что не производится проверки изменения буфе-
ра после последней команды w.
f файл
Если файл задан, он становится текущим, иначе вы-
дается текущее имя файла.
(1,$)g/РВ/список_команд
При выполнении этой глобальной команды сначала
ищутся строки, соответствующие РВ. Затем каждая из
найденных строк по очереди становится текущей и
для нее выполняется заданный список_команд. Первая
команда из списка должна располагаться на той же
строке, что и g; все строки, кроме последней,
должны завершаться символом \. В списке могут
встречаться команды a, c, i и соответствующий им
текст. Точка, завершающая режим ввода, в последней
строке списка_команд может быть опущена. Пустой
список_команд эквивалентен команде p. В списке_ко-
манд не могут встречаться команды g, G, v и V.
(1,$)G/РВ/
При выполнении интерактивной глобальной команды
сначала ищутся строки, соответствующие РВ. Затем
каждая из найденных строк по очереди становится
текущей, выводится на экран и для нее можно выпол-
нить одну команду, отличную от a, c, i, g, G, v,
V. Перевод строки рассматривается как пустая ко-
манда. Символ & обозначает повторение последней
непустой команды, выполненной в G. Заметим, что
команды при выполнении G могут адресовать любую
строку буфера. Команда G может быть прервана нажа-
тием клавиши прерывания.
h Справочная команда выдает краткое сообщение о пос-
ледней ошибке после ?-диагностики.
H Эта команда переключает режим вывода сообщений об
ошибках. Первоначально сообщения отключены.
(.)i
текст
.
Команда вставки аналогична команде добавления a,
только вставка производится перед указанной стро-
кой и адрес 0 недопустим.
(.,.+1)j
Команда об единения соединяет последовательность
строк в одну, удаляя промежуточные символы перево-
да строки. Если задан только один адрес, команда
ничего не делает.
(.)kx
Команда присваивает указанной строке имя x, кото-
рое должно состоять из одной малой буквы. После
этого данная строка может быть адресована как 'x.
Текущая строка остается прежней.
(.,.)l
Адресуемые строки распечатываются следующим обра-
зом: некоторые непечатные символы (такие как табу-
ляция или символ забоя) выводятся в соответствую-
щей мнемонике, остальные непечатные символы печа-
таются в восьмеричном виде. Длинные строки разре-
заются. Команду l можно добавить в качестве суф-
фикса к любой другой команде, кроме e, f, r и w.
(.,.)ma
Команда перемещает адресуемые строки и вставляет
их после строки с адресом a. Если на месте a задан
0, строки перемещаются в начало буфера. Адрес a не
должен попадать в диапазон перемещаемых строк. Те-
кущей становится последняя перемещенная строка.
Отметим, что только команды m и t (см. ниже) тре-
буют трех адресов, один из которых указывается
после команды.
(.,.)n
Распечатывает адресуемые строки, располагая перед
ними номер и символ табуляции. Текущей становится
последняя распечатанная строка. Команду n можно
добавить в качестве суффикса к любой другой коман-
де, кроме e, f, r и w.
(.,.)p
Распечатывает адресуемые строки, последняя из ко-
торых становится текущей. Команду p можно добавить
в качестве суффикса к любой другой команде, кроме
e, f, r и w. Например, команда dp удалит текущую
строку и выведет новую текущую строку.
P Включить/выключить приглашение * перед следующими
командами. Первоначально приглашение отсутствует.
q Команда выхода из редактора. Автоматической записи
в файл не происходит (см. ДИАГНОСТИКУ).
Q Выход из редактора без проверки изменения буфера
после последней команды w.
($)r файл
Указанный файл прочитывается и располагается после
адресованной строки. Если имя файла отсутствует,
то используется текущее имя файла (см. команды e и
f). Команда r не изменяет текущее имя файла, кроме
того случая, когда имя файла еще не установлено.
Адрес 0 допустим, в этом случае прочитанный файл
располагается в начале буфера. Если чтение прошло
успешно, то распечатывается количество прочитанных
символов. Текущей становится последняя прочитанная
строка. Если вместо файла указан символ !, остаток
строки рассматривается как команда shell'а [см.
sh(1)], вывод которой вставляется в буфер редакто-
ра. Например, команда $r !ls вставит список файлов
текущего каталога в конец редактируемого файла.
Подобная команда не изменяет текущее имя файла.
(.,.)s/РВ/заменяющая_цепочка/ или
(.,.)s/РВ/заменяющая_цепочка/g или
(.,.)s/РВ/заменяющая_цепочка/n n = 1 - 512
Команда замены производит поиск по шаблону в ука-
занном диапазоне адресов. Для каждой строки, удов-
летворяющей шаблону, выполняется замена успешно
сопоставленных не перекрывающихся цепочек символов
на заменяющую_цепочку: всех, если используется ин-
дикатор глобальной замены g, n первых, если указа-
но число, и только первой в противном случае. При
отсутствии успешных сопоставлений выдается сообще-
ние об ошибке. Текущей становится последняя стро-
ка, в которой была произведена замена. Любой сим-
вол, отличный от пробела и перевода строки, может
быть использован вместо / в качестве разделителя
РВ и заменяющей_цепочки.
Символ &, входящий в заменяющую_цепочку, заменяет-
ся на цепочку, сопоставленную с РВ в текущей стро-
ке. Специальное значение символа & можно отменить,
используя \. Имеется и более общая возможность:
конструкция \n, где n - цифра, заменяется на це-
почку, сопоставленную в текущей строке с РВ, зак-
люченным между n-й открывающей скобкой \( и соот-
ветствующей закрывающей скобкой \). Если заменяю-
щая_цепочка состоит из одного символа %, то под
этим подразумевается заменяющая_цепочка, использо-
ванная в предыдущей команде замены. Символ % теря-
ет специальное значение, если в заменяющей_цепочке
он не один, или если перед ним стоит символ \.
Строку можно разрезать, вставив в нее символ пере-
вода строки. В заменяющей_цепочке переводу строки
должен предшествовать символ \. Такая замена не
допускается в рамках команд g и v.
(.,.)ta
Эта команда аналогична команде m, только выполняет
не перемещение, а копирование адресуемых строк и
вставку их после строки с адресом a (который может
равняться 0). Текущей становится последняя строка
копии.
u Отмена (откатка) последнего изменения содержимого
буфера, вызванного командами a, c, d, g, i, j, m,
r, s, t, v, G или V.
(1,$)v/РВ/список_команд
Эта команда аналогична глобальной команде g и от-
личается лишь тем, что список_команд выполняется
только для строк, не удовлетворяющих РВ.
(1,$)V/РВ/
Эта команда аналогична интерактивной глобальной
команде G и отличается лишь тем, что на первом
этапе ищутся строки, не удовлетворяющие РВ.
(1,$)w файл
Команда записи адресуемых строк в указанный файл.
Если файл не существует, то он создается с режимом
доступа 666 (доступен всем на чтение и запись),
если только маска создания файлов [см. umask(1)]
не изменяет этот режим. Текущее имя файла не изме-
няется, если до этого оно было каким-либо способом
установлено. Если файл не указан, используется те-
кущее имя файла (см. команды e и f). Текущей оста-
ется прежняя строка. Если команда завершается ус-
пешно, выводится количество записанных символов.
Если вместо файла указан символ !, остаток строки
рассматривается как команда shell'а [см. sh(1)],
стандартным вводом которой являются адресуемые
строки. Подобная команда не изменяет текущее имя
файла.
($)= Распечатывается номер адресуемой строки. Текущей
остается прежняя строка.
!команда
Строка после ! рассматривается как команда shell'а
[см. sh(1)]. Если в этой строке встречается неэк-
ранированный символ %, он заменяется на текущее
имя файла. Если символ ! является первым символом
команды, он заменяется текстом предыдущей команды.
Так, комбинация !! приведет к повторному выполне-
нию предыдущей команды. Если в команду производи-
лась любая из двух перечисленных подстановок, рас-
печатывается окончательный текст команды. Текущей
остается прежняя строка.
(.+1)перевод_строки
"Команда", состоящая только из адреса, вызывает
печать адресуемой строки, которая становится теку-
щей. Пустая команда, состоящая только из символа
перевода строки, эквивалентна конструкции .+1p;
она полезна для продвижения по буферу.
Если нажата клавиша прерывания, редактор ed выдает со-
общение об ошибке ? и переходит в свой командный режим.
Некоторые ограничения на размеры: не более 512 символов
в строке, не более 256 символов в списке_команд при
глобальных действиях и не более 64 символов в именах
файлов. Ограничение на количество строк зависит от раз-
меров доступной памяти; каждая строка требует дополни-
тельно 1 (полу)слово.
При чтении файла ed отбрасывает нулевые байты.
Если файл не заканчивается символом перевода строки, то
ed добавляет его и выводит соответствующее сообщение.
Если завершающий разделитель для РВ или заменяющей_це-
почки непосредственно предшествует переводу строки, то
такой разделитель может быть опущен. В этом случае рас-
печатывается содержимое адресуемой строки. Следующие
пары команд эквивалентны:
s/s1/s2 s/s1/s2/p
g/s1 g/s1/p
?s1 ?s1?
ФАЙЛЫ
/usr/tmp Подразумеваемый каталог для хранения времен-
ных файлов.
$TMPDIR Каталог, используемый вместо /usr/tmp, если
переменная окружения TMPDIR существует и име-
ет непустое значение.
ed.hup В этом файле сохраняется рабочий файл при
внезапном освобождении терминальной линии.
СМ. ТАКЖЕ
edit(1), egrep(1), ex(1), fgrep(1), grep(1), red(1),
sed(1), stty(1), umask(1), vi(1).
fspec(4), regexp(5) в Справочнике программиста.
ДИАГНОСТИКА
? При обнаружении ошибки в команде.
?файл Если файл недоступен.
Чтобы получить более подробные диагностические сообще-
ния, следует пользоваться командами h и H.
Если, при наличии несохраненных изменений, делается по-
пытка разрушить содержимое буфера командой e или q, ed
выдает предупреждение (?) и позволяет продолжить редак-
тирование. В этот момент повторная команда e или q во-
зымеет действие. Опция командной строки -s отменяет
проверку наличия изменений.
СЮРПРИЗЫ
Команда ! не должна появляться в списке_команд g и v.
Последовательность \n в РВ не рассматривается как сим-
вол перевода строки.
Если стандартный ввод редактора назначен не на терми-
нал, ed завершится после первой же ошибки.
|