SED - Editace textu Pro editaci textu poskytuje standardní UNIX jednak interaktivní řádkové editory (ed, ex, vi = ex v obrazovkovém režimu). UNIX nabízí i neinteraktivní (dávkový) editor SED (Stream EDitor, napsán 1973-74 Lee E. McMahon), který slouží jako editační filtr. V UNIXu je hojně využívaný především k substitucím řetězců v textu. SED pracuje dávkově se standardním vstupem či soubory, výsledek pak posílá do standardního výstupu, editor implicitně přenáší vstup do výstupu. Příkazy editoru odpovídají interaktivnímu editoru ed, avšak zpracování probíhá sekvenčně a nelze používat relativní adresaci. Dále neexistuje příkaz m (přesun oblasti za daný řádek) a příkaz ! slouží jako znak negace příkazu. sed [-n] [-e script] [-f sfile] [files] · n - potlačení implicitního přenosu - není vidět výstup · e script - popis příkazů ve skriptu · f sfile - popis příkazů v sfile · files - vstupní soubory Existují rozličné verze SEDu pro různé platformy: · Free verze na Unixu, OS/2, Microsoft Windows (3.1, NT, Win95), MS-DOS a CP/M · Shareware a komerční verze na Unixu, Windows NT, Windows 95, MS-DOS Stejně jako existuje mnoho verzí SEDu, tak existuje i mnoho knih, výukových textů a webových stránek zabývající se SEDem. Originální uživatelský manuál od Lee E. McMahon ze sedmé edice UNIX Manual (1978) najdete na adresách: · http://www.urc.bl.ac.yu/manuals/progunix/sed.txt · http://www.softlab.ntua.gr/unix/docs/sed.txt SED aplikuje všechny příkazy na daný řádek, poté výsledek pošle na výstup a přejde na další řádek, atd. než narazí na konec souboru. SED umožňuje jednotlivé řádky adresovat. Lze adresovat konkrétní řádek pomocí jeho pořadového čísla nebo dle obsahu. Příkazy se pak budou aplikovat pouze na řádky obsahující zadaný vzor. Při použití ! dojde k aplikaci příkazů na inverzní řádky. Adresace může být aplikována i na rozsah od - do řádku. Počáteční a koncová adresa se odděluje čárkou. Lze aplikovat i více příkazů najednou. Příkazy jsou pak ve složené závorce oddělené středníkem, za posledním příkazem musí být taktéž středník (pozor ale na odchylky v různých verzích). Příkazy: $ poslední řádek r fname připojení souboru fname w fname zápis souboru W fname připojení za soubor fname q ukončení práce se SED p výpis řádku l výpis řádku se speciálními znaky = výpis čísla řádku n čtení dalšího řádku a vkládání textu za řádek () i vkládání textu před řádek j spojení řádků (vynechání ) d smazání řádku c náhrada úseku b label skok na label , pokud je label vynechán skočí se na konec souboru g rozšíření příkazu na celou zadanou oblast v negace g s/vyraz1/vyraz2/ náhrada řetězců . libovolný znak [chars] znak z množiny chars [^chars] znak, který není v chars char* libovolný počet opakovaní char (i žádný) ^ počátek řádky $ konec řádky \ch znak ch (eliminace spec. významu) Zástupné množiny znaků: [[:alnum:]] [A-Za-z0-9] Alphanumeric characters [[:alpha:]] [A-Za-z] Alphabetic characters [[:blank:]] [ \x09] Space or tab characters only [[:cntrl:]] [\x00-\x19\x7F] Control characters [[:digit:]] [0-9] Numeric characters [[:graph:]] [!-~] Printable and visible characters [[:lower:]] [a-z] Lower-case alphabetic chars [[:print:]] [ -~] Printable (non-Control) chars [[:punct:]] [!-/:-@[-`{-~] Punctuation characters [[:space:]] [ \t\v\f] All whitespace chars [[:upper:]] [A-Z] Upper-case alphabetic chars [[:xdigit:]] [0-9a-fA-F] Hexadecimal digit characters Příklady: · sed '$d' file - smaže poslední řádek souboru · sed '/^Local task/d' file - smaže řádky souboru začínající řetězcem "Local task" · sed '/\.$/!d' file - smaže řádky souboru, nekončící tečkou. · sed '5!s/ham/cheese/' file - všude kromě řádku 5 nahradí 'ham' za 'cheese' · sed '3,11 s/ham/cheese/' file - od řádku 3 do řádku 11 nahradí první výskyt 'ham' za 'cheese' · sed '3,11 s/ham/cheese/3' file - od řádku 3 do 11 nahradí třetí výskyt na řádku 'ham' za 'cheese' · sed '3,11 s/ham/cheese/g' file - od řádku 3 do řádku 11 nahradí všechny 'ham' za 'cheese' · sed '/awk/!s/aaa/bb/' file - v řádkách neobsahující 'awk' se nahradí 'aaa' za 'bb' · sed '17,/foo/d' file - smaže všechny řádky od 17-tého do řádku obsahujícího 'foo' · sed '/[0-9]\{3\}/p' file - vytiskne řádky obsahující 3 číslovky za sebou · sed '/Owner:/{s/yours/mine/g;s/your/my/g;s/you/me/g;}' file - v řádkách obsahujících 'Owner:' se provedou postupně záměny Speciální příklady: Smazání všech prázdných řádků: · sed '/^$/d' file Vložení textu a nového řádku za řádek s daným řetězecem: · sed '/retezec/{G;s/$/Toto je novy text na novem radku/;}' file Pod UNIXem: konvertovat DOS formát (CR/LF) na UNIX formát: · sed 's/.$//' file - předpokládají se všechny řádky zakončené na CR/LF · sed 's/^M$//' file - v bash/tcsh, stiskni Ctrl-V a pak Ctrl-M Pod DOSem: konvertovat UNIX formát (LF) na DOS formát: · sed 's/$//' file - metoda 1 · sed -n 'p' file - metoda 2 Smazání všech whitespace znaků na začátku každého řádku: · sed 's/^[ ^t]*//' file - v bash/tcsh, stiskni Ctrl-V a pak Ctrl-I