Библиотека сайта rus-linux.net
ED
НАЗВАНИЕ
ed - текстовый редактор
СИНТАКСИС
ed [-s] [-p приглашение] [файл]
ОПИСАНИЕ
Текстовый редактор ed является стандартным для UNIX систем. Если в
командной строке задан файл, он считывается в буфер (как будто была
выполнена команда e, см. ниже) и его можно редактировать.
Опциям команды ed приписан следующий смысл:
-s | Подавить печать количества символов при выполнении команд e, r и w, выдачу диагностики команд e и q и префикса ! после выполнения конструкции !команда. |
---|---|
-p приглашение | Задать в качестве приглашения свою цепочку символов. |
Редактор ed работает с копией файла; изменения, производимые над копией, отображаются на файл только после выполнения команды записи w. Копия текста размещается редактором во временном файле, называемом буфером. Буфер только один.
Редактор поддерживает спецификацию формата текстового файла. Если первая строка редактируемого файла содержит спецификацию формата, а у терминала, с которого вызван ed, задана характеристика -tabs или tab3 [см. man stty], то при просмотре файла нужные позиции табуляции будут установлены автоматически. Например, если в первой строке файла содержится:
<: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 следует знать, что в каждый момент времени существует текущая строка. Вообще говоря, текущей является последняя из строк, обработанных какой-либо командой. Подробнее вопрос о текущей строке обсуждается при описании каждой команды. Адреса строятся по следующим правилам:
- Символ . обозначает текущую строку.
- Символ $ обозначает последнюю строку буфера.
- Десятичное число n обозначает n-ую строку буфера.
- Пара символов 'x адресует строку, помеченную маркером x. Маркер - это малая буква, ставится с помощью команды k (см. ниже).
- РВ, заключенное между символами /, адресует первую из строк, успешно сопоставленных с РВ при движении вперед. Процесс сопоставления начинается со строки, следующей за текущей. Если до конца буфера подходящей строки не нашлось, сопоставление продолжается с начала буфера до текущей строки включительно, то есть просматривается весь буфер.
- Конструкция ?РВ? аналогична предыдущей, только просмотр выполняется в обратном направлении, начиная со строки, расположенной перед текущей.
- Если за адресом следует знак + или -, и далее стоит десятичное число, то адрес увеличивается (или уменьшается) на указанное число строк. Знак + можно опускать.
- Если адрес начинается с + или -, то смещение производится относительно текущей строки; так, адрес -5 эквивалентен .-5.
- Если адрес оканчивается на + или -, то к адресу прибавляется (из него вычитается) 1. Согласно этому и предыдущему правилу адрес из одного символа - соответствует строке, расположенной перед текущей. (В более ранних версиях редактора ту же роль играл символ ^). Более того, последовательности знаков + или - в конце адреса обладают эффектом накопления. Так, -- соответствует адресу текущей строки, уменьшенному на 2.
- Запятая обозначает пару адресов 1,$, а точка с запятой - пару адресов .,$.
Команды могут требовать ноль, один или два адреса. Адреса указываются перед командами. Задание адресов для команды, их не требующей, считается ошибкой. Если задано меньше адресов, чем нужно, используются подразумеваемые значения. Если адресов больше, чем нужно, используются последние.
Обычно адреса отделяются друг от друга запятой. Адреса могут разделяться и точкой с запятой. В этом случае текущая строка (.) становится первым адресом, и только тогда вычисляется второй, что можно использовать при поиске вперед и назад (см. выше правила 5 и 6). Второй адрес всегда должен быть больше первого (в соответствии с нумерацией строк буфера).
В следующем ниже списке команд редактора ed в скобках указаны подразумеваемые адреса. Разумеется, сами скобки не являются частью адреса.
Обычно недопустимо появление более одной команды в строке. Однако некоторые команды (такие как e, f, r или w) могут употребляться с суффиксами l, n или p. В этом случае текущая строка распечатывается или нумеруется. Далее эти команды будут обсуждены.
(.) a текст .
- Команда добавления читает данный текст и вставляет его после адресуемой строки. Текущей становится последняя из вставленных строк или, если такой нет, адресуемая строка. Адрес 0 в данном случае является корректным и обозначает вставку в начало буфера. Длина строк текста не должна превышать 256 (включая символ перевода строки).
(.) c текст .
- Команда изменения уничтожает адресуемые строки и вместо них вставляет текст. Текущей становится последняя из вставленных строк или, если такой нет, первая неудаленная строка.
(.,.) d [m [m
- Команда удаления уничтожает в буфере адресуемые строки. Текущей становится строка, следующая за последней удаленной. Если уничтожаются строки до конца буфера, то текущей становится последняя из оставшихся строк.
e файл
- Эта команда уничтожает текущее содержимое буфера и читает новое содержимое из указанного файла. Текущей становится последняя прочитанная строка. Если имя файла не указано, то используется текущее имя файла (см. команду f). Количество прочитанных символов выводится на экран. Файл становится текущим и может использоваться в последующих командах e, r и w в качестве подразумеваемого. Если вместо файла указан символ !, остаток строки рассматривается как команда shell'а, вывод которой размещается в буфере редактора. Такая команда не изменяет текущее имя файла.
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'а, вывод которой вставляется в буфер редактора. Например, команда $r !ls вставит список файлов текущего каталога в конец редактируемого файла. Подобная команда не изменяет текущее имя файла.
(.,.) s /РВ /заменяющая_цепочка / или (.,.) s /РВ /заменяющая_цепочка /g или (.,.) s /РВ /заменяющая_цепочка /nn = 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 (доступен всем на чтение и запись), если только маска создания файлов [см. man umask] не изменяет этот режим. Текущее имя файла не изменяется, если до этого оно было каким-либо способом установлено. Если файл не указан, используется текущее имя файла (см. команды e и f). Текущей остается прежняя строка. Если команда завершается успешно, выводится количество записанных символов. Если вместо файла указан символ !, остаток строки рассматривается как команда shell'а, стандартным вводом которой являются адресуемые строки. Подобная команда не изменяет текущее имя файла.
($) =
- Распечатывается номер адресуемой строки. Текущей остается прежняя строка.
!команда
- Строка после ! рассматривается как команда shell'а. Если в этой строке встречается неэкранированный символ %, он заменяется на текущее имя файла. Если символ ! является первым символом команды, он заменяется текстом предыдущей команды. Так, комбинация !! приведет к повторному выполнению предыдущей команды. Если в команду производилась любая из двух перечисленных подстановок, распечатывается окончательный текст команды. Текущей остается прежняя строка.
(.+1) перевод_строки
- "Команда", состоящая только из адреса, вызывает печать адресуемой строки, которая становится текущей. Пустая команда, состоящая только из символа перевода строки, эквивалентна конструкции .+1p; она полезна для продвижения по буферу.
Если нажата клавиша прерывания, редактор ed выдает сообщение об ошибке ? и переходит в свой командный режим.
Некоторые ограничения на размеры: не более 512 символов в строке, не более 256 символов в списке_команд при глобальных действиях и не более 64 символов в именах файлов. Ограничение на количество строк зависит от размеров доступной памяти; каждая строка требует дополнительно 1 (полу)слово.
При чтении файла ed отбрасывает нулевые байты.
Если файл не заканчивается символом перевода строки, то ed добавляет его и выводит соответствующее сообщение.
Если завершающий разделитель для РВ или заменяющей_цепочки непосредственно предшествует переводу строки, то такой разделитель может быть опущен. В этом случае распечатывается содержимое адресуемой строки. Следующие пары команд эквивалентны:
s /s1 /s2 s /s1 /s2 /p g /s1g /s1 /p ?s1 ?s1 ?
ФАЙЛЫ
/usr/tmp Подразумеваемый каталог для хранения временных файлов. $TMPDIR Каталог, используемый вместо /usr/tmp, если переменная окружения TMPDIR существует и имеет непустое значение. ed.hup В этом файле сохраняется рабочий файл при внезапном освобождении терминальной линии.
СМ. ТАКЖЕ
man stty, man umask,
vi.
ДИАГНОСТИКА
? При обнаружении ошибки в команде. ? файл Если файл недоступен.
Чтобы получить более подробные диагностические сообщения, следует пользоваться командами h и H.
Если, при наличии несохраненных изменений, делается попытка разрушить содержимое буфера командой e или q, ed выдает предупреждение (?) и позволяет продолжить редактирование. В этот момент повторная команда e или q возымеет действие. Опция командной строки -s отменяет проверку наличия изменений.
СЮРПРИЗЫ
Команда ! не должна появляться в списке_команд g и v.
Последовательность \n в РВ не рассматривается как символ перевода строки.
Если стандартный ввод редактора назначен не на терминал, ed завершится после первой же ошибки.