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 В этом файле сохраняется рабочий файл при внезапном освобождении терминальной линии. СМ. ТАКЖЕ bfs(1), 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 завершится после первой же ошибки.