Короткий опис «Стандартного» редактора UNIX

«Стандартним» редактором UNIX є ed, який спочатку був написаний Кеном Томпсоном (Ken Thompson) Він була розроблений на початку сімдесятих років в якості обчислювального середовища малих машин (У першій системі UNIX програма користувача не могла перевищувати 8 Кбайт) з надзвичайно повільними консолями (10-15 симво лов в секунду) Основою для ed послужив раніше існуючий редактор qed, свого часу користувався популярністю

Технології розвивалися, а редактор ed залишався все тим же Ви практично напевно знайдете у своїй системі інші редактори з набагато привабливішими можливостями, найпоширенішим з них є візуальний або екранний редактор, що виводить внесені зміни на термінал безпосередньо у міру редагування

Навіщо ж тоді витрачати час на застарілу програму Справа в тому, що хоча ed і старий, але деякі речі він робить по-справжньому добре Він доступний у всіх системах UNIX, так що не потрібно турбуватися при переході з однієї системи на іншу Він добре працює в умовах низької телефонного зєднання і з будь-якими видами терміналів Програму ed нескладно запустити з скрипта багато ж екранні редактори вважають, що вони управляють терміналом, і не можуть забирати вхідні дані з файлу

У ed існують регулярні вирази для завдання шаблонів Вся система пронизана регулярними виразами, утвореними з регулярних виразів ed: у grep і sed вони практично ідентичні eg-rep, awk і lex розширили їх оболонка використовує інший синтаксис, але ті ж ідеї для завдання шаблонів імен файлів У деяких екранних редакторів є «строковий» режим роботи, який є версією ed, і в ньому можна застосовувати регулярні вирази

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

Основи

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

Кожна команда ed позначається одним символом, зазвичай буквою Більша частина команд допускає завдання перед імям команди одного або двохномерів рядків, Які показують, до яких рядках повинна бути застосована команда якщо номер не заданий, використовується значення за замовчуванням Номер рядка може визначатися її абсолютним місцем розташування у файлі (1, 2, ..), умовним позначенням, таким як $ для останнього рядка і для поточної, можна здійснити пошук за шаблоном за допомогою регулярних виразів, а можна використовувати аддитивную комбінацію перерахованих способів

Давайте подивимося, як створити файл за допомогою ed, зробимо це на прикладі вірша Де Моргана (De Morgan) з глави 1

$ ed poem

?poem                              Попередження: файлpoem  не існує

a Додаємо рядки

Great  fleas  have  little  fleas upon  their  backs  to  bite  em,

And little  fleas  have  lesser  fleas, and so  ad  infinitum

.                   Вводимо “” для зупинки додавання

w poem Запис рядків у файл poem

q Вихід

$

Команда a додає рядки або дописує їх в кінець файлу режим дозаписи закінчується рядком, що містить лише точку «» Ніякої вказівки на режим, в якому ви працюєте, немає, тому поста Райт уникати двох найбільш поширених помилок: вводите текст тільки після команди a і вводите нові команди тільки після введення точки

Програма ed ніколи не записує текст у файл автоматично, треба сказати їй, щоб вона це зробила, для цього введіть команду w Якщо користувач намагається вийти з програми, що не записавши зміни, ed виводить як попередження Якщо в цей момент ввести ще одну команду q, буде здійснений вихід без збереження

змін Вихід по команді Q відбувається в будь-якому випадку, незалежно від того, записані зміни чи ні

$ ed poem

121                                 Файл існує, в ньому 121 символ a Дописати кілька рядків у кінець And the great fleas themselves, in turn,

have  greater  fleas  to  go  on

While these  again  have  greater  still, and  greater  still, and  so  on

. Вводимо точку для зупинки введення

q Спроба вийти

?                                      Попередження: зміни не записані

w Файл не вказано, передбачається, що це poem 263

q Тепер можна виходити

$ wc poem Перевіримо

8         46        263  poem

$

Вихід в оболонку за допомогою команди

Під час роботи з ed можна тимчасово вийти з неї, щоб запустити іншу команду оболонки, при цьому не треба завершувати виконання ed (виходити з нього) У такій ситуації використовуйте команду редактора

!:

$ ed poem

263

wc  poem

Запуститиwc, Не виходячи з ed

8

46

263 poem

Повернення після виконання команди

q

Можна вийти, не виконуючи w: Змін не було

$

Друк

Рядки файлу пронумеровані 1, 2, ..; можна надрукувати n-Й рядок, ввівши команду np або просто номерn щоб вивести рядки з m-Й за n-Ю, введіть m, np Номер останнього рядка позначається символом $, так що не доводиться перераховувати рядка

$                                     Вивести останній рядок, аналогічно$p 1,$p                                Надрукувати рядки з 15й по останню

Можна построчно вивести файл, просто натискаючи Return можна повернутися на рядок назад, ввівши – Номери рядків можна комбінувати за допомогою + і -:

$–2,$p                            Надрукувати останні три рядки

1,2+3p                            Надрукувати рядки з 15й по 55ю

Але друкувати рядки в зворотному порядку і заходити за кінець файлу не дозволено команди виду $, $ +1 p і $, 1p неприпустимі

Команда l (list – перелік) виводить рядки в такому форматі, який робить видимими всі символи це зручно для пошуку у файлі керуючих символів, для розпізнавання прогалин і символів табуляції і т д (Див команду vis в главі 6)

Шаблони

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

$ ed poem

263

/ Flea / Шукає наступний рядок, що містить flea Great  fleas  have  little  fleas

/ Flea / Шукає наступний рядок

And  little  fleas have lesser fleas,

/ / Шукає наступний рядок за тим же шаблоном

And  the  great fleas  themselves, in  turn,

??                                    Пошук по тому ж шаблону у зворотному напрямку

And  little  fleas have lesser fleas,

Шаблон, використаний останнім, ed запамятовує, тому пошук можна продовжити, просто вводячи / / Для пошуку в зворотному напрямку використовуйтешаблон і?.

Пошук, здійснюваний за допомогою / .. / і ..?, Виконується по колу, тобто, дійшовши до кінця тексту, поновлюється з початку, і навпаки:

$p Виводить останній рядок (p  необовязково)

and  greater  still,  and  so  on

/ Flea / Наступне входження flea  знаходиться на початку тексту

Great  fleas have little  fleas

?? Переступає через початок тексту, виконуючи пошук в зворотному напрямку

have greater fleas to  go on

Шаблон, такий як / flea /, насправді є таким же номером рядки, як 1 або $, і тому може бути використаний відповідним чином:

1,/flea/p                Надрукувати рядки з 1 до наступного входженняflea

?flea+1,$p              Надрукувати з попередньоюflea  +1 до кінця

Поточна рядок

Редактор ed відстежує останній рядок, з якою проводилися якісь дії: друк або додавання тексту, або читання файлу Такий рядок називається поточною рядком і позначається «» (Крапка) Кожна команда впливає на точку певним чином, зазвичай встановлюючи її в останній рядок, оброблену командою Крапку можна використовувати так само, як $ або звичайний номер рядка, наприклад 1:

$ ed poem

263

.                   Вивести поточний рядок, аналогічно $ після прочитання

and greater still, and so  on

. -1, P Вивести попередню і дану рядка

While these  again  have  greater  still, and  greater  still, and  so  on

Вирази, що задають номери рядків, можуть записуватися у скороченій формі:

Короткий запис:

Те ж саме:

Короткий запис:

Те ж саме:

–1

+

+1

–– або –2

–2

++ або +2

+2

n

n

+ n

+ n

$–

$–1

3

+3

Додавання, видалення, зміна і вставка

Команда a (append) Додає рядки після зазначеної рядка команда d (delete) Видаляє рядки команда i (insert) Вставляє рядки перед зазначеною рядком команда c (change) Змінює рядки, будучи комбінацією вставки та видалення

na                     Додати текст після рядка n ni              Вставити текст перед рядком n m, nd              Видалити рядки з m по n

m, nc               Змінити рядки з m по n

Якщо номери рядків не вказані, використовується крапка Новий текст для команд a, c і i закінчується рядком, що складається з символу «» при цьому точка встановлюється в останню додану рядок При видаленні точка встановлюється в рядок, наступну за останньою віддаленої, але за останній рядок $ вона не переходить

0a                          Додати текст в початок (аналогічно 1i)

dp                          Видалити поточний рядок, вивести таку (або останню, якщо в$)

.,$dp                     Видалити з цього місця до кінця, вивести нову останній рядок

1,$d                       Видалити все

?pat,–1d           Видалити з попереднього «pat» до рядка перед точкою

$dp                        Видалити останній рядок, вивести нову останній рядок

$c                          Змінити останній рядок ($a  додає після останнього рядка)

1,$c                       Змінити всі рядки

Заміна і скасування

Було б надто болісно вводити заново цілий рядок для того, щоб змінити в ній всього кілька букв Команда s (substitute) Замінює одну буквенную рядок інший:

s/old/new/          Замінити перший old  наnew  в поточному рядку s/old/new/p          Замінити перший old  наnew і надрукувати рядок s/old/new/g       Замінити кожнуold наnew в поточному рядку s/old/new/gp        Замінити кожну old  наnew і надрукувати рядок

Замінюється лише саме ліве входження, відповідне шаблоном, на рядку, якщо тільки наприкінці команди не зазначено «g» Команда s не виводить змінену рядок, якщо тільки наприкінці команди не варто

«P» Насправді більшість команд ed працює мовчки, але практично будь-яка команда може виводити результат, якщо за нею слід p

Якщо заміна не привела до очікуваного результату, то команда u (undo) Може анулювати останню заміну Точка повинна бути встановлена ​​в замінену рядок

u                            Скасувати останню заміну

up                          Скасувати останню заміну і вивести

Як і команди p і d, s допускає вказівку перед імям команди одного або двох номерів рядків, на які команда повинна впливати:

/old/s/old/new/        Знайти наступну old замінити наnew

/old/s//new/             Знайти наступну old замінити наnew

(Шаблон запамятовується)

1,$s/old/new/p        Замінити перший old  на new в кожному рядку вивести останню змінену рядок

1,$s/old/new/gp      Замінити кожну old  наnew в кожному рядку вивести останню змінену рядок

Зверніть увагу, що 1, $ s застосовує команду s до кожного рядка, але все одно означає тільки саме ліве збіг в кожному рядку а замикає g замінює всі входження у всіх рядках Крім того, p виводить тільки останню оброблену рядок для того щоб вивести всі змінені рядки, потрібна глобальна команда, про неї буде розказано пізніше

Символ & використовується для стислості запису якщо він зявляється в будь-якому місці з правого боку команди s, то замінюється тим, відповідність чому задано в лівій частині:

s/big/very &amp/      Замінити big  наvery  big s/big/&amp  &amp/           Замінитиbig  наbig  big

s/*/(&amp)/           Укласти в круглі дужки весь рядок (див * нижче) s/and/\&amp/           Замінитиand на&amp   (\ анулює спеціальне значення)

Метасимволи і регулярні вирази

В оболонці є символи зі спеціальним значенням, такі як *,> і

|, Є подібні символи і в ed, тут вони зявляються в шаблонах пошуку або в лівій частині команди s Такі символи називаються мета5 символами, А використовують їх шаблонирегулярними вираженія5 ми Символи та їх значення перераховані в табл 1 розбираючи приклади, наведені нижче, звертайтеся до таблиці Спеціальне значення деяких символів скасовується, якщо їм передує символ зворотної косої межі

Таблиця 1 Регулярні вирази редактора

Символ

Значення

c

\c

^

$

[..] [^..] r*

&amp

\(..\)

будь Неспеціальні символ c відповідає сам собі скасовує спеціальне значення символу c

відповідає початку рядка, якщо шаблон починається з ^ відповідає кінця рядка, якщо шаблон закінчується $ відповідає будь-якому окремому символу

відповідає будь-якому із символів в ..; дозволені діапазони типу a-z

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

відповідає нулю або більше входжень r, Де r – Це символ, точка або [..]

тільки в правій частині команди s породжує те, чому шукається відповідність

регулярні вирази з тегами відповідний рядок доступна як \ 1 і т д, як з правого, так і з лівого боку

Шаблон: Відповідність:

/^$/                              порожній рядок, тобто тільки роздільник рядків

//                        непорожній рядок, тобто як мінімум один символ

/^/                           всі рядки

/thing/                              thing в будь-якому місці рядка

/^thing/                             thing на початку рядка

/thing$/                             thing в кінці рядка

/^thing$/                          рядок, яка містить тільки thing

/thing$/                           thing і ще один символ в кінці рядка

/thing\$/                       thing  в кінці рядка

/\/thing\//                     /thing/ в будь-якому місці рядка

/[tT]hing                           thing або Thing  в будь-якому місці рядка

/thing[0–9]/                           thing, Потім одна цифра

/thing[^0–9]/                         thing, Потім не цифри

/thing[0–9][^0–9]/               thing, Потім спочатку цифра, потім не цифра

/thing1*thing2/                thing1, Потім будь-який рядок, потім thing2

/^thing1*thing2$/               thing1   на початку іthing2   в кінці

Регулярні вирази, що містять символ *, вибирають саме ліве відповідність і продовжують його якнайдалі Зверніть увагу на те, що x * може відповідати нулю символів, а xx * відпо ствует одному або більше символам

Глобальні команди

Глобальні команди g і v застосовують одну або декілька інших команд до безлічі рядків, заданому регулярним виразом Команда g найчастіше застосовується для друку, заміни або видалення безлічі рядків:

m,ng/re/cmd Виконати cmd для всіх рядків між m і n, відповідних re

m,nv/re/cmd Виконати cmd для всіх рядків між m і n, що не відповідають re

Команді g або v можуть передувати номери рядків, що обмежують діапазон застосування за замовчуванням прийнятий 1, $

g/../p                  Вивести всі рядки, відповідні регулярному виразу ..

g/../d                  Видалити всі рядки, відповідні ..

g/../s//repl/p            Замінити перше входження .. на кожному рядку на «repl», вивести змінені рядки

g/../s// repl/gp          Замінити кожне входження .. на «repl», вивести

змінені рядки

g/../s/pat/ repl/       На рядках, відповідних .., Замінити перший

«Pat» на «repl»

g/../s/pat/ repl/p    На рядках, відповідних .., Замінити перший

«Pat» на «repl» і вивести

g/../s/pat/ repl/gp    На рядках, відповідних .., Замінити всі

«Pat» на «repl» і вивести

v/../s/pat/ repl/gp    На рядках, що не відповідають .., Замінити всі

«Pat» на «repl» і вивести

v/^$/p                        Вивести всі непусті рядка

g/../cmd1\                 Щоб виконати кілька команд з одногоg, cmd2\                            додайте \ в кінець кожної cmd

cmd3 крім останньої

Команди, керовані глобальною командою g або v, теж можуть використовувати номери рядків Точка встановлюється по черзі в кожну обрану рядок

g/thing/,+1p                           Вивести кожну рядок зthing і наступну

g/^\EQ/1,/^\EN/–s/alpha/beta/gp      Замінитиalpha  наbeta  тільки міжEQ іEN, І вивести змінені рядки

Переміщення і копіювання рядків

Команда m переміщує групу послідовних рядків команда t створює копію групи рядків в якомусь іншому місці

m,nm  d Переміщає рядки з m по n в положення після рядка dm, nt  d Копіює рядки з m по n в положення після рядка d

Якщо вихідні рядки не вказані, використовується крапка Рядок призначення не може перебувати в діапазоні m, n51 Наведемо характерні способи застосування m і t:

m+                  Перемістити поточний рядок за наступну (перестановка)

m–2              Перемістити поточний рядок перед попередньою

m––            Аналогічно, ––  рівнозначно –2 m–                 Нічого не відбувається

m$             Перемістити поточний рядок в кінець (m0  переміщає в початок)

t       Продублювати поточний рядок (t$  дублює в кінець)

–,t    Продублювати попередню і поточну рядка

1,$t$        Продублювати всі безліч рядків

g/^/m0      Зворотний порядок рядків

Мітки та номери рядків

Команда = виводить номер для рядка $ (за замовчуванням), = Виводить номер поточного рядка і т д Точка не змінюється

Команда kc позначає рядок, до якої відбувається звернення, буквою c (У нижньому регістрі) тепер до цього рядка можна звертатися як до c Команда k не змінює точку Мітки зручно використовувати при переміщенні великих частин тексту, так як вони привязані до рядків назавжди:

/../ka                 Знайти рядок .. і позначити її якa

/../kb                 Знайти рядок .. і позначити її як b

‘a,bp                   Вивести весь діапазон, щоб бути впевненим

/../           Знайти рядок призначення

‘a,bm                 Перемістити вибрані рядки за дану

Обєднання, розбиття і перегрупування рядків

Рядки можна обєднати за допомогою команди j (пробіли не додаються):

m,nj                       Обєднати рядки з m по n в один рядок

Діапазон за замовчуванням -, +1, Так що

jp                           Обєднати поточний рядок з наступною і вивести

–,jp                     Обєднати попередній рядок з поточною і вивести

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

s/part1part2/part1\ part2/

..

Розділити рядок на дві частини

s/ /\

/g

Розділити на кожному прогалині

виходить по одному слову на рядку

Точка залишається на останній створеної рядку

Щоб працювати з частинами відповідних регулярних виразів, а не з цілими, використовуйте регулярні вирази з тегами: Якщо в регулярному виразі зявляється конструкція виду \ (.. \), то частина цілого, якій вона відповідає, доступна як з правого, так і з лівого боку як \ 1 Може бути задано до девяти регулярних виразів з тегами, на які посилаються як на \ 1, \ 2 і т д

s/\(..\)\(*\)/\2\1/        Перемістити перші 3 символу в кінець

/\(.*\)\1/                    Знайти рядки, що містять повторювану сусідню рядок

Файлові команди

Команди читання і записи r і w можуть застосовуватися з зазначеними перед ними номерами рядків:

nr file Прочитати file додати його після рядка n встановити крапку в останню прочитану рядок

m,nw  file Записати рядки m5n в file точка не змінюється

m,nW  file Записати рядки m5n в кінець file точка не змінюється

За замовчуванням діапазоном в командах w і W є весь файл Значним за замовчуванням n в команді r є $, що не дуже-то вдало Будьте уважні

Редактор ed запамятовує перше імя файлу, вказане в командному рядку або в команді r або w Команда f виводить або змінює імя запомненного файлу:

f                        Вивести імя запомненного файлу

f file Замінити запомненное імя на «file»

Команда редагування e заново инициализирует ed запомненним або новим файлом:

e                            Почати редагування запомненного файлу

e  file Почати редагування «file»

Команда e володіє тим же властивістю, що і q: якщо зроблені зміни не були збережені, то після першого введення e зявиться повідомлення про помилку Команда e реініціалізірует незалежно від того, збережені зміни чи ні У деяких системах ed і e повязані посиланням, тому одна й та ж команда (e імя5файла) Може бути використана як всередині редактора, так і поза ним

Шифрування

Файли можуть бути зашифровані при записі і розшифровані при читанні за допомогою команди x, при цьому буде ввести відповідний пароль Шифрування аналогічно crypt (1) У деяких системах команда x була замінена на X (верхній регістр), щоб уникнути ненавмисного Шиф вання

Зведення команд

Список команд ed представлений в табл 2, а фіксований набір команд – в табл 3 Кожній команді передує нуль, один або два номери рядків, які вказують, скільки номерів рядків можна заду вать, і значення за умовчанням, якщо номери не задані За здебільшого команд може слідувати p, тоді виводиться остання оброблена рядок або l для перерахування рядків Точка зазвичай встановлюється в останню оброблену рядок команди f, k, w, x, = і не змінюють її

Вправа Коли ви вирішите, що знаєте ed, випробуйте редактор quiz см quiz (6) ~

Таблиця 2 Команди редактора

Команда Дія

. A додає текст до тих пір, поки не буде введена рядок, що складається з одного символу «»

., C змінює рядка новий текст закінчується так само, як і в a

., D видаляє рядки

e file                   реініціалізірует дляfile Команда E робить це, навіть якщо зміни не збережені

f file                   встановлює запомненний файл в file

1,$g/re/cmds    виконує команду edcmds для кожного рядка, відповідної регулярному виразу re кілька cmds поділяються \ newline (Символ нового рядка)

. I вставляє текст перед рядком, закінчується так само, як і в a

., +1 J обєднує рядки в одну

.kc                       позначає рядок буквою c

Таблиця 2 (продовження)

Команда

Дія

,l

,mline

,p q

$r  file

,s/re/new/

,tline

u 1,$v/re/cmds

1,$w  file

x

$=

cmdline

(+1)newline

перераховує рядки, робить видимими невидимі символи пересуває рядка за line

друкує рядки

вихід Q виходить, навіть якщо зміни не збережені читає file

замінює на new те, що відповідає re

копіює рядки після line

скасовує останню заміну на рядку (тільки одну) виконує команду ed cmds для кожного рядка, що не відповідають-

вующей re

записує рядки вfile  W дописує в кінець замість того, щоб перезаписувати

вхід в режим шифрування (або ed-x імя5файла) Виводить номер рядка

виконує команду UNIXcmdline

виводить рядок

Таблиця 3 Номери рядків редактора

Позначення

Сенс

n

$

/re/

re ‘c N1+5n N1,N2

N1N2

абсолютний номер рядка n, n = 0, 1, 2, .. поточна рядок

останній рядок тексту

наступна рядок, що відповідає re переходить з $ на 1 попередній рядок, відповідна re переходить з 1 на $ рядок з позначкою c

рядок N1± n (Адитивна комбінація)

рядки з N1 по N2

встановлює точку в N1,  потім оцінює N2

N1  і N2  можуть бути задані будь-яким з перерахованих вище способів

Джерело: Керниган Б, Пайк Р, UNIX Програмне оточення – Пер з англ – СПб: Символ-Плюс, 2003 – 416 с, Мул

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*