НАЗВАНИЕ
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.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 следует знать, что в каждый момент времени существует текущая строка. Вообще говоря, текущей является последняя из строк, обработанных какой-либо командой. Подробнее вопрос о текущей строке обсуждается при описании каждой команды. Адреса строятся по следующим правилам:
Команды могут требовать ноль, один или два адреса. Адреса указываются перед командами. Задание адресов для команды, их не требующей, считается ошибкой. Если задано меньше адресов, чем нужно, используются подразумеваемые значения. Если адресов больше, чем нужно, используются последние.
Обычно адреса отделяются друг от друга запятой. Адреса могут разделяться и точкой с запятой. В этом случае текущая строка (.) становится первым адресом, и только тогда вычисляется второй, что можно использовать при поиске вперед и назад (см. выше правила 5 и 6). Второй адрес всегда должен быть больше первого (в соответствии с нумерацией строк буфера).
В следующем ниже списке команд редактора ed в скобках указаны подразумеваемые адреса. Разумеется, сами скобки не являются частью адреса.
Обычно недопустимо появление более одной команды в строке. Однако некоторые команды (такие как e, f, r или w) могут употребляться с суффиксами l, n или p. В этом случае текущая строка распечатывается или нумеруется. Далее эти команды будут обсуждены.
(.)a текст .
(.)c текст .
(.,.)d [m [m
e файл
E файл
f файл
(1,$)g/РВ/список_команд
(1,$)G/РВ/
h
H
(.)i текст .
(.,.+1)j
(.)kx
(.,.)l
(.,.)ma
(.,.)n
(.,.)p
P
q
Q
($)r файл
(.,.)s/РВ/заменяющая_цепочка/ или (.,.)s/РВ/заменяющая_цепочка/g или (.,.)s/РВ/заменяющая_цепочка/n n = 1 - 512
Символ &, входящий в заменяющую_цепочку, заменяется на цепочку, сопоставленную с РВ в текущей строке. Специальное значение символа & можно отменить, используя \. Имеется и более общая возможность: конструкция \n, где n - цифра, заменяется на цепочку, сопоставленную в текущей строке с РВ, заключенным между n-й открывающей скобкой \( и соответствующей закрывающей скобкой \). Если заменяющая_цепочка состоит из одного символа %, то под этим подразумевается заменяющая_цепочка, использованная в предыдущей команде замены. Символ % теряет специальное значение, если в заменяющей_цепочке он не один, или если перед ним стоит символ \.
Строку можно разрезать, вставив в нее символ перевода строки. В заменяющей_цепочке переводу строки должен предшествовать символ \. Такая замена не допускается в рамках команд g и v.
(.,.)ta
u
(1,$)v/РВ/список_команд
(1,$)V/РВ/
(1,$)w файл
($)=
!команда
(.+1)перевод_строки
Если нажата клавиша прерывания, редактор 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 завершится после первой же ошибки.