Програмски алат сед
sed (скраћено од енгл. stream editor) је алат који служи за разчлањивање и мењање текста, коришћењем једноставног и компактног програмског језика, под Unix оперативним системом. sed је развијан од 1973 до 1974. године, на њему је радио Lee_E._McMahon , који је радио у Bell_Labs. Данас је sed доступан на већини оперативних система. sed је заснован на скрипт карактеристикама интерактивног едитора ed ("editor", 1971) и старијег qed[мртва веза] ("quick editor", 1965-66). sed је био један од најранијих алата за подршку регуларних израза и остаје у употреби за обраду текста, због команде замене (тј. супституције). Други слични алати укључују AWK и Perl.
Историја алата sed
[уреди | уреди извор]sed је једна од првих команди опетаривног система Unix направљена са намером да се из командне линије може обрађивати датотека са подацима. Еволуира као природни наледник популарне grep команде. Синтакса sed -а, нарочито коришћење / за подударање узорака(енгл. pattern matching) и s/// за замену (једног дела текста другим), оријентисани ка ed-у ,који је претеча sed-a, који је био у употреби у то време, и синтакса регуларних израза утицали су на друге језике, пре свега на ECMAScript и на Perl. Касније је развијен моћни AWK, који је омогућио да се значајне обраде текста ураде коришћењем скриптова. AWK и sed се сматрају прегенераторима и инспирацијом за Perl,имали су утицај на синтаксу и сематику овог језика,посебно на подударање узорака и замену.
GNU sed има неколико побољшања,која укључују уређивање фајлова у месту (енгл. in-place editing ). Super-sed је проширена верзија sed-а која укључује регуларне изразе компатибилне са Perl-ом. Друга варијанта sed-а је minised, GNU_Project користио је minised током писања нове верзије sed-а засноване на новим GNU библиотекама за рад са регуларним изразима. Садашњи minised садржи неке додатке за BSD sed, али није толико богат као GNU sed. Његова предност је у томе што је веома брз и користи мало меморије.
Начин рада
[уреди | уреди извор]sed је линијски оријентисан алат за обраду текста: учитава текст,линију по линију,са улаза што може бити ток(енгл.stream) или датотека,у унутрашњи бафер који се на енглеском зове 'pattern space'. Учитавањем линије почиње циклус. У унутрешњем баферу sed примењује једну или више опарација које су дефинисане помоћ sed скрипта. sed обухвата око 25 команди за рад са текстом. За сваку линију се након извршавања скрипта исписује на излаз модификовану улаз (добијен применом операција дефинисаних скриптом над том линијом) и ,започиње се нови циклус следећом линијом улаза. Могуће је подесити и да се скрипт другације понаша након извршених операција над текстом навођењем sed опција и скрипт команди,нпр. d за брисање садржаја који је у баферу,q за излаз,N за аутоматско додавање нове линије у бафер и тако даље. Тако sed скрипт одговара телу петље која итерира кроз линије тока, где сама петља и променљива петље (тренутни број линије) су имплицитни и одржава их sed.
sed скрипт може се задати из командне линије(-е опција) или читањем из датотеке (-f опција). Команде sed скрипта могу користити опционе адресе, у смислу редног броја линије или регуларних израза. Адреса се одређује приликом извршавања команде. На пример, команда 2d ће применити команду d(брисање) на другу линију улаза (као излаз добијамо све линије улаза осим друге), док се наредбом /^ /d бришу сви редови који почињу размаком. Специјалан одвојени бафер,који се на енглеском зове 'hold space', користе неке наредбе sed-а за чување текста између два циклуса. sed-ов командни језик има само две променљиве("hold space" и "pattern space") и GOTO наредбу која служи као наредба гранања. Ипак,језик је Тјуринг комплетан,чак су и неке игрице писане помоћу sed скриптова: Sokoban, Arkanoid, шах и тетрис.
Наредба 10q првих 10 линија улаза и зауставиће се.
Коришћење
[уреди | уреди извор]Наредба замене
[уреди | уреди извор]Следећи примери показују типичне, а најчешће, употребе sed-а,за замену. Овај начин употребе је оригинална мотивација за sed:
sed 's/regexp/replacement/g' inputFileName > outputFileName
У неким верзијама sed-а, изразу мора да претходи -е како би указао да израз следи. s означава замену(енгл. substitute),док g означава глобално (енгл. global),што значи да ће свака линија која задовољава услов бити обрађена. regexp је регуларни израз (тј. образац) који би требало да задовољи онај део текста који желимо да изменимо, replacement представља онај текст којим мењамо. Дакле,део текста који задовољава регуларни изразе мењамо са оним који је наведен као replacement у горњем примеру. Коса црта (/) конвенционални симбол,потиче од знака за "претрагу" у ed-у,мада се би се могао користити било који други знак за повећање читљивости ако се тај знак не налази у regexp или replacement делу наредбе. Команда замене потиче од ed-ове команде "нађи и замени".
На пример, sed -r "s/(cat|dog)s?/\1s/g" замењује свако појављивање речи "cat" или "dog" са "cats" или "dogs", ако је у тексту већ писало "cats" или "dogs" нема измене. (cat|dog) је први(у овој наредби и једини) сачуван подизраз у оквиру регуларног израза,а \1 се "чува" пронађен део текста који задовољава први подизраз. Пронађен део текста који задовољава први подизраз иза ког може бити слово "s"(једно или ниједно) замењује тим пронађен делом текста ком је надовезано слово "s".
Друге sed наредбе
[уреди | уреди извор]Осим замене, други облици једноставних обрада су могући, користећи неке од 25 команди које sed нуди. На пример, следећа употреба команде d за брисање линије које су или празне или само садрже размаке:
sed '/^ *$/d' inputFileName
Регуларан израз "^ *$" одговара редовима који једино садрже знак размака нула,један или више пута.
Знак "^" (сидро) је ознака за почетак реда,означава да ред почиње оним што следи непосредно након овог знака.
Знак "$" (долар) је ознака за крај реда, означава да се ред завршава оним што је непосредно пре овог знака.
Ако се употребе оба знака на начин као у датом примеру, онда се тражи ред који садржи само оно што је описано регуларним изразом између знакова "^" и "$" (одизраз регуларног израза је регуларни израз).
Знак "*" (звездица) означава да подизраз који му претходи може се појављивати у тексту који задовољава цео регуларни израз нула,један или више(коначан,али неограничен број) пута.
Сложене sed конструкције су могуће, што му омогућава да послужи као једноставан, али високоспецијализован програмски језик. Током контроле, на пример, може се управљати употребом лабеле и инструкције гранања b. Инструкцијом b прескочиће се на блок нареби који следи након лабеле b.
sed као филтер
[уреди | уреди извор]Под Unix оперативним системом,sed се често користи као филтер приликом пајповања:
generate_data | sed 's/x/y/g'
Излаз програма generate_data помоћу sed-а се измени т.д. се свако појављивање слова "x" замени са "y".
Наводници око израза нису обавезни,ако упит постављамо из конзоле (командне линије),осим као shell,иначе,не тумачи израз као једну реч. У овом примеру s/x/y/g нема двосмислености,па је дозвољено исти упит написати на следећи начин:
generate_data | sed s/x/y/g
Како год, наводници се често користе да би било јасније и читљивије,неопхоно их је користити ако израз садржи белине (нпр. 's/x x/y y/'). Чешће се користе једноструки наводници,да би се избегло shell-ово тумачење $ као shell променљиве. Двоструки наводници се користе,као такви "s/$1/$2/g", када се допушта да shell замени аргументе командне линије или друге shell променљиве.
Ограничења и алтернативе
[уреди | уреди извор]Иако једноставан и ограничен,sed је довољно моћан за многе послове. За софистициранију обраду, користе се моћнији језици као што су AWK или Perl. Они се посебно користите ако обрађујући линију на сложенији начин, иако произвољно компликоване трансформације су,у принципу,могуће коришћењем sed-а.
С друге стране, за једноставније послове, постоје специјализовани Unix алати као што су grep (штампа линије које се подударају са образцем), head (штампа први део фајла), tail (штампа последњи део датотеке), и tr (превођење или брисање знакова) су често бољи избор од sed-а. За специфичне задатке које су дизајниране да изврше, такви специјализовани алати су обично једноставнији, јаснији и бржи од општијег решења као што је sed.
ed/sed наредбе и синтакса се користе код неких програма и данас,нпр. текст едитори vi и vim. Аналогно са ed/sed постоје sam/ssam.