НАЗВА

ed, red - текстовий редактор

СТИСЛИЙ ОГЛЯД

ed [-] [-Gs] [-p ланцюжок] [файл]
red [-] [-Gs] [-p ланцюжок] [файл]

ОПИС

ed є рядково-зорієнтованим текстовим редактором. Він використовується для створення, відображення, зміни і маніпуляції текстових файлів. red є обмеженим ed: він може лише редагувати файли у поточному каталозі але не виконувати команд оболонки.

Якщо викликано з аргументом файл, тоді файл буде зчитано у буфер редактора. Зміни здійснюються по відношенню до цього буферу, а не самого файлу. Після завершення сеансу, будь-які зміни, не збережені явно командою `w', буде втрачено.

Редагування відбувається у двох відмінних режимах: командному і режимі вводу . Як тільки ed запущено, він опиняється у командному стані. У цьому режимі, команди зчитуються зі стандартного вводу і виконуються для того, щоб маніпулювати вміст буферу редактора. Типова команда може виглядати так:

,s/old/new/g



що замінить всі випадки ланцюжка old на new.

Коли надано команди вводу, такі як a' (англ. append - додати),i' (англ. insert - ввід) або `c' (англ. change - змінити), ed увійде у режим вводу. Це основний спосіб додавання нового тексту до файлу. У цьому режимі, жодна команда не є доступною, натомість стандартний ввід записується безпосередньо до буфера редактора. Рядки складаються з тексту аж до знаку нового рядка включно. Режим вводу переривається після того, як внести поодиноку крапку на одному рядку.

Усі команди ed оперують по відношенню до цілих рядків або діапазонів рядків; тобто, команда d' (англ. delete - стерти) вилучає рядки; командаm' (англ. move - перемістити) переміщує рядки і.т.д. Є можливість змінити лише частину рядка завдяки заміні, як у прикладі вище. Тим не менш, навіть тоді команда `s' застосовуватиметься по відношенню до цілого рядка.

Загалом, команди ed складаються з жодної або декількох адрес рядків, після яких слідує одна літера команди із можливими додатковими параметрами. Тобто команди мають наступну структуру:

   [_адреса_ [,_адреса_]]_команда_[_параметри_]

Адреса(и) вказують на ті рядки або діапазон рядків, над якими відбудеться дія команди. Якщо надано менше адрес, ніж команда вимагає, тоді підставляються адреси за замовчуванням.

ОПЦІЇ

-G : Примушує до оберненої сумісності. Впливає на такі команди як G',V', f',l', m',t' і `!!'.

-s : Пригнічує діагностичні повідомлення. Рекомендовано вживати якщо стандартний ввід для ed надходить зі скрипта.

-p ланцюжок : Встановлює вигляд підказки. Може бути вимкнена і ввімкнена назад командою `P'.

файл : Вказує назву файлу, який необхідно прочитати (у буфер). Якщо файлу передує знак оклику (!), тоді ця назва інтерпретується як оболонкова команда. У цьому випадку, що буде прочитано, так це стандартний вивід команди, виконаної через ?sh(1). Щоб прочитати файл, чиє ім'я починається зі знаку оклику, екрануйте цей знак зворотнім слешом ().

РЯДКОВА АДРЕСАЦІЯ

Адреса являє собою номер рядка у буфері. ed включає поточну адресу, яка надається командам автоматично як адреса за замовчуванням у випадку, коли жодної не було вказано. Коли тільки-но прочитано файл, поточна адреса встановлюється до останнього рядка файлу. Загалом, поточна адреса встановлюється до останнього, зміненого якоюсь командою, рядка.

Рядкова адреса побудована з однієї зі складових, перелічених нижче, із можливим числовим зсувом після. Зсув може включати будь-яку комбінацію чисел, операторів (таких як +, - і ^) і пробілів. Адреси зчитуються зліва-направо і їхнє значення обчислюється по відношенню до поточної адреси.

Єдиним виключенням до правила, що адреси представляють порядковий номер рядків, є адреса з номером 0 (нуль). Це означає "перед першим рядком" і допустимо там, де має сенс.

Діапазон складається з двох адрес, розділених комою або крапкою з комою. Значення першої адреси в діапазоні не може перевищувати значення другої. Якщо надало лишень одну адресу у діапазоні, то друга адреса набуває того самого значення, що й перша. Якщо вказано n-нну кількість адрес, де n > 2, тоді діапазон обчислюється з останніх двох адрес. Якщо очікується лише одна адреса, буде використано останню з n-нних адрес.

Кожна адреса з розділеною комою діапазону інтерпретується відносно поточної адреси. У випадку розділеному комою з крапкою діапазоні, поточна адреса встановлюється до першої зі вказаних у діапазоні і друга адреса інтерпретується по відношенню до першої.

Розпізнаються наступні символи для позначення адрес:

. : Поточний рядок (адреса) в буфері.

$ : Останній рядок у буфері.

n : n-нний рядок в буфері, де n є числом у проміжку [0,$].

-:

^ : Попередній рядок. Це рівнозначно -1 і можна повторювати для накопичувального ефекту.

-n:

^n : n-нний попередній рядок, де n повинно бути додатковим числом.

+ : Наступний рядок. Це рівнозначно +1 і можна повторювати для накопичувального ефекту.

+n:

пробілn : n-нний наступний рядок, де n повинно бути додатковим числом. Пробіл із послідуючою цифрою n розглядається як +n.

,:

% : Перший до останнього рядка в буфері. Це рівнозначно діапазону адрес 1,$.

/re/ : Наступний рядок, що містить регулярний вираз re. Пошук завертається до початку буферу і продовжується до поточного рядка, якщо необхідно. // повторює останній пошук.

?re? : Попередній рядок, що містить регулярний вираз re. Пошук завертається до кінця буферу і продовжується до поточного рядка, якщо необхідно. ?? повторює останній пошук.

'lc : Рядок, попередньо помічений командою `k' (команда мічення), де lc являється літерою нижнього регістру.

РЕГУЛЯРНІ ВИРАЗИ

Регулярні вирази являються зразками, використовуваними для вибору тексту. Так наприклад, команда ed

  g/_ланцюжок_/

виведе всі рядки, що містять ланцюжок. Регулярні вирази також використовуються командою `s' для вибору старого тексту, який буде замінено новим.

Окрім вказування ланцюжкових констант, регулярні вирази можуть представляти також класи знаків. Регулярний вираз може співпасти з декількома ланцюжками на тому самому рядку. В такому випадку, вибрано буде найлівіше найдовше співпадання.

Для побудови регулярних виразів використовуються наступні символи:

c : Будь-який знак c, не перелічений нижче, включаючи {',}', (',)', <' і>', що співпаде самий з собою.

_c : Екранований зворотнім слешом знак c_ окрім таких знаків як {',}', (',)', <',>', b', 'B',w', W',+' і `?', що співпаде самий з собою. Співпадає із будь-яким одним знаком.

    [:alnum:]  [:cntrl:]  [:lower:]  [:space:]
    [:alpha:]  [:digit:]  [:print:]  [:upper:]
    [:blank:]  [:graph:]  [:punct:]  [:xdigit:]



Якщо риска `-' з'явиться як перший або останній знак класу знаків, вона репрезентуватиме саму себе. Всі інші знаки класу знаків співпадають із самими собою.

[класзнаків_] : Співпаде з будь-яким одним знаком із класу знаків. Щоб включити знак ]' до класу, цей знак повинен бути розміщеним першим. Діапазон знаків можна вказати через дефіс, наприкладa-z' вказує на всі літери нижнього регістру. Наступні буквенні вирази також можна вжити для вказівки наборів знаків:

Зразки класу знаків, що мають форму

[.ел-кол.] або [=ел-кол=]



де .І ел-кол являється елементом коляції (послідовності сортування знаків), розглядаються відповідно від поточної локалі (не підтримується на даний момент. Дивіться сторінку підручника ?locale(5)). Загляніть до regex(3) для додаткової інформації про класи знаків.

[^класзнаків] : Співпаде з будь-яким знаком (за винятком знаку нового рядка), що не входить у клас знаків_.

^ : Якщо символ `^' стоїть першим знаком регулярного виразу, тоді він позначає початок рядка і зв'язує даний регулярний вираз з початком рядка. У протилежному випадку він співпадає самий з собою.

$ : Якщо символ `$' стоїть першим знаком регулярного виразу, тоді він позначає кінець рядка і зв'язує даний регулярний вираз з кінцем рядка. У протилежному випадку він співпадає з самим собою.

(re) : Означує підвираз re (можливо відсутній). Підвирази можуть гніздуватися. Послідовне зворотнє звертання, що має форму \_n_', де _n_ являється числом в інтервалі [1,9] розкривається до тексту, що співпав з _n_-нним підвиразом. Наприклад, регулярний вираз(a.c)\1' співпаде з ланцюжком abcabc', але не зabcadc'. Підвирази впорядковані відносно їхнього лівого розмежувача.

  • Співпадає з нульовою або більше кількістю регулярних виразів з одного знаку або підвиразів, розміщених попереду *'. Якщо', це перший знак регулярного виразу або підвиразу, тоді він співпадає сам з собою. Оператор *' іноді призводить до несподіваних результатів. Так, наприклад, регулярний виразb' може співпасти з початком ланцюжка abbb', а не зbbb', since a null match is the only left-most match.

{n,m}:

{n,} :

{n} : Співпадає з передуючим регулярним виразом з одного знаку або з підвиразом щонайменше n разів, але щонайбільше m раз. Якщо m пропущено, тоді співпадає щонайменше n разів. Якщо кому також пропущено, тоді співпадання повинно відбутися точно n раз. У випадку, якщо будь-яка з цих форм стоїть першою, без попереднього регулярного виразу з одного знаку або з підвиразу, тоді вона розглядатиметься буквально (тобто, регулярний вираз \{2\}' співпадатиме з ланцюжком{2}' і.т.п.).

<:

> : Прикріплює регулярний вираз з одного знаку або з підвираз, які стоять після < або перед > до, відповідно, початку або кінця "слова" (в ASCII, це суцільний ланцюжок, що складається з літер і цифр і жорсткого пробілу (_)).

Наступним операторам, що являються розширенням, передує зворотній слеш (), щоб відрізнити їх від традиційного синтаксису ed.

`:

\' : Беззастережно співпадає з початком (`) або кінцем (\') рядка.

\? : Необов'язкове співпадання з попереднім регулярним виразом з одного знаку або підвиразом. Так, наприклад, регулярний вираз a[bd]\?c' співпаде з ланцюжкамиabc', adc' іac'. Якщо \? з'явиться на початку регулярного виразу або підвиразу, тоді воно співпадає з буквальним `?'.

+ : Співпадає з передуючим регулярним виразом з одного знаку або з підвиразом принаймні один раз або більше. Тож, регулярний вираз a+' є скороченням дляaa*'. Якщо + з'явиться на початку регулярного виразу або підвиразу, тоді воно співпадає з буквальним `+'.

\b : Співпадає з початком або кінцем (нульовий ланцюжок) слова. Таким чином, регулярний вираз \bhello\b' еквівалентний<hello>'. Проте, \b\b' є чинним регулярним виразом, тоді як<>' - ні.

\B : Співпадає з серединою слова (нульовим ланцюжком). \" не розумію \B. FIXME

\w : Співпадає з будь-яким знаком всередині слова.

\W : Співпадає з будь-яким знаком, що не знаходиться всередині слова.

КОМАНДИ

Всі команди ed складаються з одного знаку, хоча деякі з них можуть вимагати додаткових параметрів. Якщо параметр команди простягнувся через декілька рядків, тоді кожний рядок, за винятком останнього, необхідно завершити зворотнім слешом ().

Як правило, не більше однієї команди дозволено на одному рядку. Тим не менш, до більшість команд можна додати суфікс виводу p' (print), перелікуl' (list) і нумерації `n' (enumerate) для виводу останнього рядка, над яким відбулася дія команди.

Переривання (типово ^C) має як ефект припинення поточної команди і повернення редактора до командного стану.

ed розпізнає наступні команди. Команди показані з адресою за замовчуванням або діапазон адрес вказано штучно (в дужках).

(.)a : Додає (англ. append) текст до буферу поточного рядка, який може знаходитись також за адресою 0 (нуль). Текст добавляється у режимі вводу. Поточна адреса встановлюється до останнього введеного рядка.

(.,.)c : Змінює рядки у буфері. Вказані вами рядки вилучаються з буферу і добавляється ваш текст натомість. Текст добавляється у режимі вводу. Поточна адреса встановлюється до останнього введеного рядка.

(.,.)d : Вилучає вказані вами рядки з буферу. Якщо існує рядок після видалених, поточна адреса встановиться до цього рядка. У протилежному випадку, поточна адреса встановлюється до рядка попереду видаленого діапазону.

e файл : Редагує файл і встановлює назву файлу за замовчуванням. \" ??? FIXME Якщо файл не вказано, тоді буде використано назву файлу за замовчуванням. Будь-які рядки, присутні у буфері, видаляються до того як прочитати новий файл. Поточна адреса встановлюється до останнього прочитаного рядка.

e !команда : Редагує стандартний вивід `e !команди' (дивіться e !команда нижче). Назва файлу за замовчуванням залишається незмінною. \" ??? FIXME Будь-які рядки, присутні у буфері, видаляються перед тим як прочитати вивід команди. Поточна адреса встановлюється до останнього прочитаного рядка.

E файл : Беззастережно редагує файл. Ця команда тотожна команді `e', за винятком того, що незаписані зміни відкидаються без попередження. Поточна адреса встановлюється до останнього прочитаного рядка.

f назвафайлу : Встановлює назву файлу за замовчуванням до назвифайлу. Якщо назвуфайлу_ не вказано, тоді виводить неекрановану назву файлу за замовчуванням.

(1,$)g/re/списоккоманд : Застосовує списоккоманд до кожного рядка, що співпадає з регулярним виразом re. Поточна адреса встановлюється до рядка, що співпав з регулярним виразом до виконання спискукоманд. Після виконання команди `g', поточна адреса встановлюється до останнього рядка, над яким списоккоманд мав вплив.

Кожна команда у спискукоманд повинна бути на окремому рядку і кожний рядок, за винятком останнього, повинен закінчуватись зворотнім слешом (). Дозволяється додавати будь-які команди за винятком g',G', v' таV'. Самотній знак нового рядка серед спискукоманд рівнозначний команді `p'.

(1,$)G/re/ : Інтерактивне редагування рядків, що співпадають з регулярним виразом re. Кожний співпадаючий рядок виводиться на екран, поточна адреса встановлюється до цього рядка і від користувача вимагається ввести списоккоманд. Після виконання команди `G', поточна адреса встановлюється до останнього рядка, над яким списоккоманд мав вплив.

Формат спискукоманд_ той самий, що й при команді g'. Самотній знак нового рядка діє ніби нульовий список команд. Поодинокий&' (знак кон'юнкції) повторює останній ненульовий список команд.

H : Викликає вивід пояснення помилок. Стандартно, пояснення не виводяться. Рекомендовано, щоб скрипти починалися з цієї команди для додаткової помочі у налагодженні.

h : Виводить пояснення останньої помилки.

(.)i : Вставляє текст у буфер перед поточним рядком. Текст добавляється у режимі вводу. Поточна адреса встановлюється до останнього введеного рядка.

(.,.+1)j : Об'єднує рядки. Вказані рядки видаляються з буферу і замінюються їхнім об'єднанням. Поточна адреса встановлюється до рядка, отриманого в результаті.

(.)k_lc : Позначає рядок літерою нижнього регістру lc. Пізніше, цей рядок може бути адресовано з інших команд як 'lc (тобто одинична лапка за якою слідує літера lc_). Мітка залишається чинною до тих пір, доки рядок видалено або змінено якимось чином.

(.,.)l : Недвозначно виводить всі вказані рядки. Якщо команду викликано з терміналу, ed призупиняється після виводу кожної сторінки доти, доки ви не введете знак нового рядка. Поточна адреса встановлюється до останнього виведеного рядка.

(.,.)m(.) : Переміщує рядки у буфері. Вказані рядки переміщуються до місця, вказаного з правої сторони, яке може бути також адресою під номером 0 (нуль). Поточна адреса встановлюється до останнього переміщеного рядка.

(.,.)n : Виводить вказані рядки разом із порядковим числом (нумерацією). Поточна адреса встановлюється до останнього виведеного рядка.

(.,.)p : Виводить вказані рядки. Якщо команду викликано з терміналу, ed призупиняється після виводу кожної сторінки доти, доки ви не введете знак нового рядка. Поточна адреса встановлюється до останнього виведеного рядка.

P : Вмикає і вимикає запрошення. За винятком коли запрошення було вказане опцією командного рядка -p ланцюжок, воно стандартно вимкнене.

q : Завершує сеанс ed.

Q : Завершує сеанс ed беззастережно. Тотожно команді `q', за винятком того, що незбережені зміни відкидаються без попередження.

($)r файл : Зчитує файл (вносячи його у буфер) після вказаної адреси рядка. Якщо файл не вказано, тоді використовується назва файлу за замовчуванням. Якщо до виконання команди не існувало назви файлу за замовчуванням, воно встановиться до файлу. У протилежному випадку, назва файлу за замовчуванням залишиться незмінною. Поточна адреса встановиться до останнього прочитаного рядка.

($)r !команда : Зчитує (вносячи у буфер) стандартний вивід `!команди' (дивіться !команда нижче) після вказаної адреси рядка. Назва файлу за замовчуванням залишається незмінною. Поточна адреса встановлюється до останнього прочитаного рядка.

(.,.)s/re/заміна/:

(.,.)s/re/заміна/g :

(.,.)s/re/заміна/n : Замінює текст рядків, що співпадають з регулярним виразом re. Стандартно, лише перше співпадання в рядкові піддається заміні. Якщо надано суфікс g' (англ. global), тоді - всі. Суфіксn', де n, це додаткове ціле число, спричинює до заміни лише n-нного співпадання. Якщо жодної заміни на вказаних рядках не відбулося, це вважатиметься за помилку. Поточна адреса встановлюється до останнього зміненого рядка.

re і ланцюжок заміни можуть бути розмежовані будь-якими знаками окрім пробілу і знаку нового рядка (дивіться команду s' нижче). Якщо один або два з останніх розділювачів опущено, тоді буде виведено останній рядок, над яким відбулася дія, так ніби було додано суфіксp'.

Неекранований &' у _заміні_ буде замінено на поточний текст що співпав. Послідовність знаків_m', де m є числом в діапазоні [1,9] замінюється на m-ннє зворотнє посилання на текст, що співпав. Якщо заміна складається з поодинокого `%', тоді буде використано заміну з останньої операції заміщення. Знаки нового рядка можна включати у текст заміни_ якщо їх екрановано зворотнім слешом ().

(.,.)s : Повторює останню операцію заміщення. Ця форма команди s' сприймає лічильний суфіксn' або будь-яку комбінацію знаків n',g' і p'. Якщо вказано лічильний суфіксn', тоді тільки над n-нним співпаданням відбудеться заміна. Суфікс r' спричиняє до того, що використовуватиметься регулярний вираз останнього пошуку замість того, що використовувався під час останньої заміни. Суфіксp' вмикає вивід для останньої операції заміни. Поточна адреса встановлюється до останнього рядка, над яким відбулася дія.

(.,.)t(.) : Копіює (тобто переносить) адресовані рядки до вказаної з правої сторони адреси, яка може бути також адресою 0 (нуль). Поточна адреса встановлюється до останнього копійованого рядка.

u : Скасовує останню команду і відновлює поточну адресу до попередньої. Глобальні команди g',G', v' іV' розглядаються як одиничні команди у цьому випадку. Команда `u' інвертує саму себе.

(1,$)v/re/списоккоманд : Застосовує списоккоманд до кожного рядка, що співпадає з регулярним виразом re. Схоже до команди `g'.

(1,$)V/re/ : Інтерактивне редагування рядків, що не співпадають з регулярним виразом re. Схоже до команди `G'.

(1,$)w файл : Записує вказані рядки до файлу. Весь попередній вміст файлу буде втрачено без попередження. Якщо не існувало назви за замовчуванням файлу, тоді вона встановиться до вказаного файлу, в протилежному випадку, вона залишиться незмінною. Якщо назва не вказується взагалі, використовується назва файлу за замовчуванням. Поточна адреса залишається незмінною.

(1,$)wq файл : Записує вказані рядки до файлу, після чого виконує команду `q'.

(1,$)w ! команда : Пише стандартний вивід у стандартний ввід `!команди' (дивіться !команда нижче). Назва файлу за замовчуванням і поточна адреса залишаються незмінними.

(.)x : Копіює (операція put) вміст вирізного буферу одразу після вказаного рядка. Поточна адреса встановлюється до останнього копійованого рядка.

(.,.)y : Копіює (операція yank) вказані рядки до вирізного буферу. Вирізний буфер можна перезаписати послідуючими командами y',s', j',d' або `c'. Поточна адреса залишається незмінною.

(.+1)z_n : Прокручує n рядків за раз, починаючи зі вказаного рядка. Якщо n_ не вказано, тоді буде використано поточний розмір екрану. Поточна адреса встановлюється до останнього виведеного рядка.

!команда : Виконує команду, за допомогою ?sh(1). Якщо першим знаком команди стоїть !', тоді це заміниться на текст попередньої!команди'. ed не обробляє команду на предмет екранації зворотнім слешом (). Проте, неекранований %' замінюється на назву файлу за замовчуванням. Після закінчення виконання оболонкою, виводиться!' на стандартний вивід. Поточна адреса залишається незмінною.

(.,.)# : Розпочинає коментар. Решту рядка аж до знака нового рядка ігноруватиметься. Якщо додатково надано адресу рядка з наступною крапкою з комою, тоді поточна адреса встановиться до неї. В протилежному випадку поточна адреса залишається незмінною.

($)= : Виводить порядковий номер (поточного) рядка.

(.+1)новий рядок : Виводить вказаний рядок і встановлює поточну адресу до нього.

ФАЙЛИ

/tmp/ed.* : Файл буферу.

ed.hup : Файл, у якому ed намагатиметься зберегти буфер у випадку, якщо термінал зависне.

ДИВІТЬСЯ ТАКОЖ

?vi(1), sed(1), regex(3), ?sh(1).

    1. Kernighan and P. J. Plauger, Software Tools in Pascal, Addison-Wesley, 1981.

ОБМЕЖЕННЯ

ed обробляє аргументи файл щодо екранації зворотнім слешом, тобто у назві файлу будь-який знак з попереднім зворотнім слешом () інтерпретується буквально.

Якщо текстовий (не бінарний) файл не закінчується знаком нового рядка, ed додасть його після зчитування/запису до файлу. У випадку ж бінарних файлів, ed цього не здійснює.

ДІАГНОСТИКА

При виникненні помилки, якщо ввід ed надходить зі звичайного файлу або тут-документу, редактор завершить роботу, у протилежному випадку, він виводить ?' (знак запитання) і повертається до командного режиму. Пояснення останньої помилки можна отримати за допомогою командиh' (help).

Намагання покинути ed або відредагувати інший файл до збереження зміненого буферу призведе до помилки. Якщо повторити команду, вона матиме успіх, але всі зміни до буферу буде втрачено.

ed виходить із статусом 0, якщо не відбулася помилка, у протилежному випадку статус виходу >0 (більше нуля).