Sed

**sed** (ад ) — патокавы тэкставы рэдактар (а таксама мова праграмавання), які здзяйсняе розныя прадвызначаныя тэкставыя пераўтварэнні ў паслядоўным патоку тэкставай інфармацыі.

Першапачаткова быў напісаны як UNIX-утыліта Лі Макмэханам () з Bell Labs у 1973—74 гадах. Зараз sed даступны фактычна для любой аперацыйнай сістэмы, якая падтрымлівае работу з камандным радком.

## Апісанне 
sed атрымлівае ўваходны паток (звычайна файл) парадкова, рэдагуе кожны радок згодна правілам, вызначаным у sed-скрыпце з ужываннем простай мовы sed, і потым выводзіць вынік у выходны паток.

sed часта завуць неінтэрактыўным тэкставым рэдактарам. Ён адрозніваецца ад звычайных тэкставых рэдактараў «інвертаванасцю» адносна тэксту і набору каманд рэдагавання. Звычайныя тэкставыя рэдактары спачатку загружаюць увесь тэкст дакумента, а потым прымяняюць да яго каманды па адной, у той час як sed спачатку загружае ў сябе набор каманд, а потым прымяняе ўвесь набор каманд да кожнага радка тэксту. Паколькі адначасова ў памяці знаходзіцца толькі адзін радок, sed можа апрацоўваць даволі вялікія тэкставыя файлы.

Набор каманд sed зроблены на ўзор рэдактара ed, аднак патрэбна памятаць аб яго інвертаванасці. Напрыклад, каманда **25d** рэдактара ed значыць «*ісці да радка 25 і выдаліць яго*», у той жа час як тая ж каманда sed значыць «*калі гэта радок з нумарам 25, то выдаліць (не выводзіць) яго*». Вядомае выключэнне — гэта каманды капіравання і перамяшчэння, якія ахопліваюць дыяпазон радкоў і такім чынам не маюць прамых эквівалентаў у sed, замест гэтага sed увозіць дадатковы буфер, які называецца «прасторай захопу», і дадатковыя каманды для кіравання ім. Напрыклад, каманда «*капіраваць радок 25 у радок 76*» (**25t76**) у ed была б запісана як дзве асобныя каманды (**25h; 76g**) у sed для таго, каб захаваць радок у прасторы захопу да той пары, пакуль звесткі не будуць выняты.

Наступны прыклад дэманструе тыповае ўжыванне sed:

```bash
sed -e 's/oldstuff/newstuff/g' inputFileName > outputFileName
```

Тут *s* — замена; *g* — глабальна, што значыць «*усе ўваходжанні шуканага значэння*». Пасля першага прамога слэша змешчаны рэгулярны выраз для пошуку, пасля другога — выраз для замены. Аднак варта памятаць, што апроч слэша можа ўжывацца і другі сімвал. Напрыклад выразы

```bash
echo 123123| sed 's/1/5/g'
echo 123123| sed 's%1%5%g'
echo 123123| sed 's$1$5$g'
echo 123123| sed 's|1|5|g'
```

цалкам эквівалентныя.

Каманда замены (s///) безумоўна з'яўляецца самай магутнай і часта ўжыванай камандай sed. Можна ўжываць каманду перанакіравання стандартнага вываду «`> outputFileName`» , тады sed выведзе вынікі на экран.

У Unix каманда sed часта ўжываецца ў выглядзе фільтра ў канвееры (| ці pipe):

```bash
generate_data | sed -e 's/x/y/'
```

Такім чынам генеруюцца звесткі і перадаюцца на канвеер, каб замяніць *x* на *y*.

Некалькі каманд могуць быць аб'яднаны ў адным файле (напрыклад, subst.sed) і потым ужыты ў выглядзе:

```bash
sed -f subst.sed inputFileName > outputFileName
```

Апроч замены, магчымы і іншыя формы простай апрацоўкі. Напрыклад, наступны сцэнарый выдаляе пустыя радкі альбо радкі, якія змяшчаюць толькі прабелы:

```bash
sed -e '/^\s*$/d' inputFileName
```

Апошні прыклад ужывае частку рэгулярных выразаў-метасімвалаў:
* ^ Адпавядае пачатку радка
* $ Адпавядае канцу радка
* . Адпавядае любому адзінаму сімвалу
* * Адпавядае нулю ці больш паўтораў папярэдняга сімвала
* [ ] Адпавядаюць аднаму любому з сімвалаў, уключаных у квадратныя дужкі паміж [ і ]
* [^ ] Адпавядаюць аднаму любому з сімвалаў, не ўключаных у квадратныя дужкі паміж [^ і ]
* \*літара* адпавядаюць аднаму любому сімвалу з пэўнага класа сімвалаў, у прыватнасці \s - гэта любы прабельны сімвал.

Комплексныя канструкцыі sed магчымы да такой ступені, што ён можа быць прадстаўлены як высока спецыялізаваная, хоць і простая, мова праграмавання. Патокам кіравання, напрыклад, можна кіраваць з дапамогай меткі (двукроп'е, за якім ідзе радок, якая павінна быць імем меткі) і інструкцыя галінавання **b**; інструкцыя **b**, за якой ідзе правільнае імя меткі, перасуне апрацоўку ў блок пасля меткі; калі метка не існуе, тады галінаванне завершыць сцэнарый (скрыпт).

sed — гэта адна з найранейшых каманд Unix, якія дазвалялі апрацоўваць файлы з каманднага радка. sed развіўся як натуральны пераемнік папулярнай каманды grep. Роднасны больш позняй мове праграмавання AWK, sed дазволіў ужываць у shell скрыптах моцную і цікавую апрацоўку інфармацыі, і быў адным з першых інструментаў Unix, які сапраўды заахвочваў адэкватна выкарыстоўваць рэгулярныя выразы.

sed і awk часта лічацца прабацькамі і натхняльнікамі мовы Perl, і ў асаблівасці сінтаксісу «`s///`» з прыкладу вышэй.

У мовы sed няма пераменных, ёсць толькі прымітыў GOTO і функцыйныя магчымасці, якія выконваюць галінаванне; тым не менш гэта цьюрынг-поўная мова.

GNU sed мае некалькі новых асаблівасцяў, напрыклад замяшчальная праўка файлаў (замена першапачатковага файла вынікам працы sed). Замяшчальная праўка часта ужываецца замест сцэнарыя ed, напрыклад

```bash
sed -i 's/abc/def/' file
```

можа ўжывацца замест

```bash
ed file
 1,$ s/abc/def/
 w
 q
```

Існуе пашыраная версія sed, якая называецца  **Super-sed** (ssed), якая ўключае рэгулярныя выразы, сумяшчальныя з Perl.

## Спасылкі 
* Аднарадковыя скрыпты sed  
* Системное руководство по sed 
* Документация по sed 
* Однострочные скрипты sed  
* Редактирование /etc/network/interfaces в Debian средствами sed  
* Просто о sed 
* Шпаргалка Sed 
* sed на SourceForge.net 
* The sed FAQ  

* sed … потоковый редактор 
* Super-sed  
* Спецыфікацыя sed у Адзінай спецыфікацыі UNIX на сайце The Open Group
* Гульня sokoban на sed 
* Тэтрыс на sed 
* Sed for Windows 

Катэгорыя:Тэкставыя рэдактары
Катэгорыя:Прылады Unix для апрацоўкі тэксту
Катэгорыя:Скрыптовыя мовы