При работе с редактором допускается использование трех способов адресации строк:
1. Абсолютный способ.
Например:
10,20w или 1,5p
В небольших файлах, состоящих всего из нескольких строк, этот способ идентификации вполне пригоден. Если же файл содержит около сотни строк, то такой метод становится затруднительным, а при числе строк в файле, измеряемом тысячами, просто неприемлемым. В больших файлах применяют другой способ идентификации строк – относительный.
2. Относительный способ.
Например, –5,+5p напечатает пять строк, предшествующих текущей, текущую строку и пять строк, следующих за ней. Кроме того, эта команда сместит на пять строк вперед позицию текущей строки.
3. Контекстный способ.
Например, /hello/p выполнит поиск в прямом направлении и напечатает строку, содержащую образ hello. Для краткости можно повторить поиск с помощью команды //. Редактор ed подразумевает при этом, что вы ищите последний заданный шаблон.
Например, /program/,/text/p выполнит поиск в прямом направлении и напечатает строки, находящиеся в диапазоне строк, содержащих образы program и text.
Например, ?word?p выполнит поиск в обратном направлении и напечатает строку, содержащую образ word. Повторить поиск в обратном направлении можно командой ??.
Возможно совмещение контекстного и относительного метода адресации строк.
Например, ?word?–3,.p выполнит поиск образа «word» в обратном направлении, затем делается смещение на три строки назад и печатаются строки до текущей (то же самое можно представить и в другом виде: ?word?–––,.p). При контекстной адресации редактор начинает поиск вслед за текущей строкой. В том случае, когда указанный образ не удается найти до конца файла, редактор переключается на поиск с первой строки файла вплоть до текущей. При поиске в обратном направлении указанный образ ищется от текущей строки до начала файла. Если образ не обнаружен, редактор переключается на поиск с конца файла до текущей строки. Для происходящего во время поиска переключения с начала файла на его конец или с конца файла на начало принят термин «замыкание». Вы можете представить себе файл как список, замкнутый циклически, т.е. последняя строка в нем предшествует первой.
Применение знаков «+» и «–» полезно при просмотре любого файла.
Иногда необходимо перевести контекстное задание строки в ее абсолютный номер. Это команда [адрес]=
Например, /program/= определит вам номер строки, содержащей слово program.
При работе с редактором допускается совместное использование абсолютного, относительного и контекстного способов адресации строк. Выбор конкретного способа определяется тем, что вам нужно сделать. Методы адресации строк различаются по степени безопасности. Наиболее безопасен абсолютный, так как он исключает неоднозначность. Относительный способ безопасен при условии, что вы на самом деле находитесь в той части файла, где предполагаете. Контекстная же адресация, несмотря на свое удобство, достаточно опасна.
Общая форма многих команд ed имеет следующий вид:
[адрес,адрес][буква_команды][имя файла]
Заданные по умолчанию адреса могут быть различными и зависят от конкретной команды.
Например, для команды w по умолчанию задаются адреса 1,$. Таким образом, w означает команду 1,$w и записывает все сроки на диск. По умолчанию используется текущее имя файла.
Редакторы ОС UNIX нумеруют строки, начиная с первой, но допускают существование условной строки с номером 0, чтобы предоставить возможность перемещения текста в начало файла. Любые строки, помещенные после строки 0, попадают в начало файла.
Пробелы между адресной частью и буквой команды не допускаются. В зависимости от команды (a,p,w) действие будет применяться к строкам, заданным в адресной части или возможно к строкам, следующим за адресной частью.
Текущий адрес всегда представляется символом точки (которую нельзя путать с точкой, завершающей сеанс редактирования). Вы можете использовать точку в любом аргументе адреса вместо обычного номера строки.
Пара адресов 1,$ и .,$ настолько часто используется, что допустимы следующие сокращения:
,p – то же самое, что 1,$p (выводит строки от первой до последней);
;p – то же самое, что .,$p (выводит строки с текущей до последней).
Примеры использования команд
Наиболее удобным вариантом вывода текущей строки является точка. Для вывода диапазона строк можно комбинировать точку с другими адресами.
p (.p или .,.p или .,. или . или p)– осуществляется печать текущей строки.
.,$p – выведет на экран все строки, начиная от текущей до последней.
.,5p – вывод на экран всех строк, начиная от текущей до строки 5 (предполагается, что вы находитесь выше пятой строки).
1p – печать первой строки.
1,$p – печать всех строк.
–1p (.–p или .–1 или –1 или –p или –) – выведет на экран строку перед текущей строкой и (обычно) сбрасывает значение точки в адрес выведенной строки.
2,3w name_file – записывает 2 строки в файл на диске, Если указанный файл не существует, то он будет создаваться. Если же он уже существует, то будет записан заново, поэтому будьте осторожны.
3,6w – записывает в текущий файл на диске строки с 3–й по 6–ю.
10d – удаление 10 строки.
+10d – удаление 10 строки после текущей.
d – удаление текущей строки.
10,15d – удаление строк с 10–й по 15–ю.
20,/new/d – удаление строк, начиная с 20–й вплоть до той, которая содержит образ «new» включительно.
3i – вставляет текст перед строкой 3.
3,4с – изменяет строки 3 и 4 на новый введенный после команды текст.
m50 – размещает текущую строку после строки 50–й.
m$ – перемещает текущую строку в конец.
m0 – перемещает текущую строку в начало.
m+ (.,.m.+1) – меняет местами текущую строку со следующей.
1,2m4 – перемещает строки 1–ю и 2–ю, вставляя их после строки 4.
1,1m6 (1m6) – перемещает первую строку, вставляя ее после строки 6.
30m31 – ставит строку 30–ю после строки 31–й.
/hi/,50m0 – пересылает группу строк, начиная с той, в которой встречается набор символов «hi» , и кончая строкой 50, в позицию после строки 0.
t. – дублирует текущую строку.
t$ – копирует текущую строку в конец буфера.
1,$t$ – дублирует весь буфер в конец.
27t30 – передает строку 27 вслед за строкой 30, не удаляя 27–ю строку.
s/^/ /p – заменит символ начала строки на пять пробелов.
s/$/+++++/p – добавит пять плюсов к концу строки.
s/sport//p – удаляет из строки последовательность символов «sport» и выведет на экран исправленную строку.
20s/URIX/UNIX/ – будет исправлена опечатка в 20–й строке.
1,$s/URIX/UNIX/ – будет исправлена опечатка, если вы несколько раз ошиблись в тексте.
s/one/two/gp – сделает множественную замену в одной строке.
1,$s/one/two/ – сделает замену во всех строках, но только первого экземпляра в каждой строке.
1,$s/one/two/g – редактор произведет множественные замены в горизонтальном и вертикальном направлениях.
s/sun/moon/3 – если в текущей строке содержится 4 вхождения образ «sun», то команда заменит третье вхождение «sun» на «moon». Последнее число может принимать значения в диапазоне от 1 до 512 (по умолчанию это 1, то есть заменяется первое вхождение).
s/g//– удалит лишнюю букву g в слове proggram текущей строки.
g/help/p – напечатает все строки, содержащие последовательность символов «help».
50,100g/alpha/p – напечатает все строки, содержащие слово «alpha» в пределах от строки 50 до строки 100.
/beta/,/alpha/g/zet/d – удаляются все строки, включающие текстовый образ «zet», начиная с 1–й строки, содержащей образ «beta», до 1–й строки, в которую входит образ «alpha». Строки, содержащие «zet» и расположенные вне этого диапазона, не удаляются.
v/–/s/330/340/p – во всех строках, не содержащих дефис, число 330 заменяется на 340.