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.

Спасылкі[правіць | правіць зыходнік]

Шаблон:Стаўбцы Шаблон:Стаўбец

Шаблон:Стаўбец

Шаблон:Стаўбцы/канец

Шаблон:Тэкставыя рэдактары