Nahrazovani

Jednim z nejcasteji pouzivanych prikazu editoru ex je nahrazovani. Prikaz se nazyva s (substitute) a ma nasledujici tvar:
<radky>s/<co_hledat>/<cim_nahradit>/<volby>
Jako vsechny ostatni zacina urcenim radku, kterych se ma nahrazeni tykat. Za prikazem s se uvadeji dva retezce, jako obvykle vymezene lomitky. Prvni urcuje, jaky text ma editor hledat, a druhy cim jej nahradit.

Priklad:
Kdybych chtel v celem textu nahradit retezec raz retezcem dva, pouzil bych:
:%s/raz/dva/
Pripominam, ze procento ztelesnuje vsechny radky souboru.
Takto trivialni pripad vas samozrejme tezko ohromi, ale predevsim pri vyhledavani se ukazuje sila regularnich vyrazu. Navic je muzete pouzivat hned na dvou mistech: jednak ve specifikaci radku (kde se ma pravidlo pouzit), jednak v parametrech vyhledavani. Pokrocilejsi priklady uvedu pozdeji.

Volby

Ucinek nahrazovani lze ovlivnovat volbami, ktere se uvadeji za zaverecnym lomitkem. Nejcasteji pouzivane jsou dve: g a c.

Volba g zpusobi, ze vim nahradi vsechny vyskyty retezce na radku. Implicitne totiz nahrazuje pouze prvni z nich, takze z radku

raz raz raz dva raz
(oblibene vojenske zaklinadlo pro synchronizaci pochodujicich) by prikaz
:s/raz/dva/
udelal
dva raz raz dva raz
Teprve prikaz
:s/raz/dva/g
zajisti nahrazeni vsech slov a vznikne
dva dva dva dva dva
Abych mluvil skutecnou pravdu, chovani vim zavisi na nastaveni parametru gdefault. Pokud je zapnut (:set gdefault), editor implicitne nahrazuje vsechny vyskyty retezce na radku. Pri pouziti volby g pak bude nahrazovat vzdy jen prvni kousek na kazdem radku. Vypnuty parametr (:set nogdefault) pak zajisti vyse popsane chovani, ktere je implicitni pro puvodni editor vi i radu dalsich programu systemu Unix.

Druha volba umoznuje potvrzovani kazde nahrady. Zadate-li

:%s/raz/dva/gc
vim se pokusi nahradit vsechny retezce raz v textu, ale kazdy z nich nejprve predvede a dotaze se, zda jej ma skutecne nahradit. Tato vlastnost je velmi uzitecna, pokud se necitite silni v kolenou a mate jiste obavy, ze hledanemu retezci by mohlo vyhovet i neco navic proti vasemu zameru. Svou odpoved muzete vybirat z obvyklych moznosti:
y nahradit dany vyskyt
n ponechat tento vyskyt v puvodnim tvaru a pokracovat dal
[Esc] nebo q ponechat tento vyskyt v puvodnim tvaru a ukoncit nahrazovani
a nahradit tento a vsechny nasledujici vyskyty

Komplikovanejsi priklady

Kdysi jsem v jednom zdrojovem textu potreboval vsechny ciselne udaje vydelit deseti. To vlastne znamena vyhledat vsechna cisla a pred posledni cislici do nich vlozit tecku. Zminenou akci obstara prikaz
:%s/\([0-9]*\)\([0-9]\)/\1.\2/g
Hleda skupiny cislic a ty si diky mechanismu zapamatovani (kulate zavorky s lomitkem) rozdeli vzdy na dve casti. Prvni je dlouha podle potreby a druha obsahuje vzdy prave jednu (posledni) cislici. V nahrazovacim retezci jen zopakuje tyto zapamatovane skupiny, avsak mezi ne vlozi tecku.

Nedavno jsme menili strukturu domacich adresaru uzivatelu na disku. Pro kazdeho uzivatele obsahoval soubor informace o uzivatelskem jmene a domacim adresari - napriklad

PAVEL.SATRAPA,USR:HOME\KIT\SATRAPA
Soubor byl usporadan abecedne podle uzivatelskych jmen. My jsme vsak potrebovali seskupit uzivatele podle kateder, ktere se projevuji v ceste k domacimu adresari za adresarem HOME (jakozto prislusnik katedry informacnich technologii bydlim v adresari KIT). Potrebovali jsme tudiz vycucnout dotycne jmeno adresare a zapsat je jako prvni udaj na radku - abychom obdrzeli
KIT,PAVEL.SATRAPA,USR:HOME\KIT\SATRAPA
Takovy soubor pak staci protahnout standardnim programem sort a clenove jednotlivych kateder se razem ocitnou pospolu. Potrebnou transformaci obstara
:%s/\^(.*:HOME\\\)\([^\\]*\)/\2,\1\2
Pri vyhledavani si prikaz zapamatuje vse od zacatku radku az po retezec :HOME\ (jelikoz lomitko ma specialni vyznam, musi se v hledanem retezci zdvojit). Pod cislem 2 se nasledne zapamatuje retezec znaku, odlisnych od lomitka (jinymi slovy cely nazev adresare az po nasledujici lomitko). V nahrazovacim retezci se nejprve vypise tento nazev adresare, za nim carka a pak beze zmeny obe zapamatovane casti textu.
<-- predchozi  [obsah]  dalsi -->
© 1997, 1998 Pavel Satrapa