Sed

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

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

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

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

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

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

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

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

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):

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

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

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

 sed -f subst.sed inputFileName > outputFileName

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

 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, напрыклад

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

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

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

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