![]() |
NahrazováníJedním z nejčastěji používaných příkazů editoru ex je nahrazování. Příkaz se nazývás (substitute) a má následující
tvar:
<řádky>Jako všechny ostatní začíná určením řádků, kterých se má nahrazení týkat. Za příkazem s se uvádějí dva řetězce, jako
obvykle vymezené lomítky. První určuje, jaký text má editor hledat, a druhý čím
jej nahradit.
Příklad:Takto triviální případ vás samozřejmě těžko ohromí, ale především při vyhledávání se ukazuje síla regulárních výrazů. Navíc je můžete používat hned na dvou místech: jednak ve specifikaci řádků (kde se má pravidlo použít), jednak v parametrech vyhledávání. Pokročilejší příklady uvedu později.
VolbyÚčinek nahrazování lze ovlivňovat volbami, které se uvádějí za závěrečným lomítkem. Nejčastěji používané jsou dvě:g a c .
Volba
(oblíbené vojenské zaklínadlo pro synchronizaci pochodujících) by příkaz
udělal
Teprve příkaz
zajistí nahrazení všech slov a vznikne
Abych mluvil skutečnou pravdu, chování vim závisí na nastavení
parametru gdefault . Pokud je zapnut (:set gdefault ), editor implicitně nahrazuje všechny výskyty
řetězce na řádku. Při použití volby g pak bude
nahrazovat vždy jen první kousek na každém řádku. Vypnutý parametr (:set nogdefault ) pak zajistí výše popsané chování, které je
implicitní pro původní editor vi i řadu dalších programů systému
Unix.
Druhá volba umožňuje potvrzování každé náhrady. Zadáte-li
vim se pokusí nahradit všechny řetězce raz v textu, ale
každý z nich nejprve předvede a dotáže se, zda jej má skutečně nahradit. Tato
vlastnost je velmi užitečná, pokud se necítíte silní v kolenou a máte jisté
obavy, že hledanému řetězci by mohlo vyhovět i něco navíc proti vašemu záměru.
Svou odpověď můžete vybírat z obvyklých možností:
Komplikovanější příkladyKdysi jsem v jednom zdrojovém textu potřeboval všechny číselné údaje vydělit deseti. To vlastně znamená vyhledat všechna čísla a před poslední číslici do nich vložit tečku. Zmíněnou akci obstará příkaz
Hledá skupiny číslic a ty si díky mechanismu zapamatování (kulaté závorky s
lomítkem) rozdělí vždy na dvě části. První je dlouhá podle potřeby a druhá
obsahuje vždy právě jednu (poslední) číslici. V nahrazovacím řetězci jen
zopakuje tyto zapamatované skupiny, avšak mezi ně vloží tečku.
Nedávno jsme měnili strukturu domácích adresářů uživatelů na disku. Pro každého uživatele obsahoval soubor informace o uživatelském jméně a domácím adresáři - například
Soubor byl uspořádán abecedně podle uživatelských jmen. My jsme však
potřebovali seskupit uživatele podle kateder, které se projevují v cestě k
domácímu adresáři za adresářem HOME (jakožto příslušník katedry
informačních technologií bydlím v adresáři KIT ). Potřebovali jsme
tudíž vycucnout dotyčné jméno adresáře a zapsat je jako první údaj na
řádku - abychom obdrželi
Takový soubor pak stačí protáhnout standardním programem sort a
členové jednotlivých kateder se rázem ocitnou pospolu. Potřebnou transformaci
obstará
Při vyhledávání si příkaz zapamatuje vše od začátku řádku až po řetězec
:HOME\ (jelikož lomítko má speciální význam, musí se v hledaném
řetězci zdvojit). Pod číslem 2 se následně zapamatuje řetězec znaků,
odlišných od lomítka (jinými slovy celý název adresáře až po následující
lomítko). V nahrazovacím řetězci se nejprve vypíše tento název adresáře, za ním
čárka a pak beze změny obě zapamatované části textu.
© 1997, 1998 Pavel Satrapa
|