Hledat a nahradit

Tip 31 Tisknutelná Monobook Předchozí Další

vytvořeno 2001 · složitost základní · verze 6.0

Vim poskytuje :s (náhradní) příkaz pro hledání a nahrazení; tento tip ukazuje příklady, jak nahradit. Na některých systémech má gvim v nabídce Úpravy příkaz Najít a nahradit (: help: promptrepl), je však snazší použít příkaz :s kvůli jeho historii příkazového řádku a možnosti vkládání text (například slovo pod kurzorem) do polí pro vyhledávání nebo nahrazování.

Základní vyhledávání a nahrazování

Příkaz :substitute vyhledá textový vzor a nahradí ho textovým řetězcem. Existuje mnoho možností, ale pravděpodobně budete chtít:

:s/foo/bar/gNajděte každý výskyt výrazu „foo“ (pouze v aktuálním řádku) a nahraďte jej barem „.:%s/foo/bar/gNajděte každý výskyt výrazu „foo“ (ve všech řádcích) a nahraďte jej výrazem „bar“.:%s/foo/bar/gcZměňte každé „foo“ na „bar“, ale nejprve si vyžádejte potvrzení.:%s/\<foo\>/bar/gcZměňte pouze celá slova, která přesně odpovídají výrazu „foo“, na „bar“; požádat o potvrzení.:%s/foo/bar/gciZměňte každé „foo“ (nerozlišují se velká a malá písmena kvůli příznakui) na „bar“; požádat o potvrzení.:%s/foo\c/bar/gcje stejný, protože\cčiní velikost písmen při vyhledávání necitlivými. To může být žádoucí po použití:set noignorecase, aby se ve vyhledávání rozlišovala velká a malá písmena (výchozí).:%s/foo/bar/gcIZměňte každý „foo“ (rozlišuje velká a malá písmena kvůli příznakuI) na „bar“; požádat o potvrzení.:%s/foo\C/bar/gcje stejný, protože\Cčiní velká a malá písmena hledání citlivými. To může být žádoucí po použití:set ignorecase, aby se při vyhledávání nerozlišovala malá a velká písmena.

Příznak g znamená globální – každý výskyt v řádku se změní, nikoli pouze první. Tento tip předpokládá výchozí nastavení pro možnosti "gdefault" a "edcompatible" (vypnuto), které vyžaduje, aby g příznak musí být zahrnut do %s///g k provedení globální náhrady. Použití :set gdefault vytváří zmatek, protože %s/// je globální, zatímco %s///g není (tj. , g obrací jeho význam).

Při použití příznaku c musíte u každé shody potvrdit, co dělat. Vim vypíše něco jako: replace with foobar (y/n/a/q/l/^E/^Y)? (kde foobar je náhradní část příkazu :s/.../.../. Můžete zadat což znamená nahradit tento zápas, n tento zápas přeskočit, a nahradit tento a všechny zbývající zápasy ( „všechny“ zbývající shody), q ukončení příkazu, l nahrazení této shody a ukončení (myslím na „poslední“), ^E posouvat obrazovku nahoru podržením klávesy Ctrl a stisknutím klávesy E a ^Y posouvat obrazovku dolů podržením klávesy Ctrl a stisknutím Y. Poslední dvě možnosti jsou však k dispozici pouze v případě, že je váš Vim normální, velký nebo obrovský nebo byla v době kompilace povolena funkce insert_expand (ve výstupu vyhledejte +insert_expand z :version).

Také při použití příznaku c přeskočí Vim na t První shodu nalezne počínaje od horní části vyrovnávací paměti a vyzve vás k potvrzení, že v této shodě provedete výměnu. Vim použije IncSearch skupinu zvýraznění na odpovídající text, aby vám poskytl vizuální vodítko, na kterou shodu pracuje (nastaveno na reverse standardně pro všechny tři typy termínů od Vim 7.3). Pokud je navíc nalezena více než jedna shoda a máte zvýraznění vyhledávání povoleno pomocí :set hlsearch, zvýrazní Vim zbývající shody pomocí Search skupiny zvýraznění . Pokud používáte zvýraznění vyhledávání, měli byste se ujistit, že tyto dvě skupiny zvýraznění jsou vizuálně odlišné, nebo nebudete moci snadno zjistit, kterou shodu vás Vim vyzývá k nahrazení.

Podrobnosti

Rozsah vyhledávání:

Poznámka: Od verze Vim 7.3 se substituce aplikují na rozsah definovaný značkami nebo vizuální výběr (který používá speciální typ značek „< a „>) nejsou ve výchozím nastavení ohraničeny pozicí sloupců značek. Místo toho použije Vim substituci na celý řádek, na kterém se každá značka objeví, pokud se používá ve vzoru jako::"<,">s/\%Vfoo/bar/g.

Při vyhledávání:

.,*,\,určuje / kolekci. Rozsahy znaků lze vyjádřit pomocí-; například písmeno a, b, c nebo číslo 1 lze porovnat s. Negujte kolekci pomocíshodného s jakýmkoli znakem kromě a, b, c nebo 1.\{#\}se používá k opakování./foo.\{2\}bude odpovídat foo a dvěma následujícím znakům.\se na konci}nevyžaduje, takže/foo.\{2}udělá totéž.\(foo\)dělá zpětné odkazy na foo. Závorky bez úniků jsou doslova uzavřeny. Zde je\vyžadován pro uzavření\).

Při nahrazování:

\rje nový řádek,\nje nulový bajt (0x00).\&je ampersand (& je text, který odpovídá vzoru vyhledávání).\0vloží text odpovídající celému vzoru\1vloží text první zpětné reference.\2vloží druhou zpětnou referenci atd.

Můžete použít jiné oddělovače s náhradou:

:s#http://www.example.com/index.html#http://example.com/#

Uložte psaní pomocí \zs a \ze k nastavení začátku a konce vzoru. Například místo:

:s/Copyright 2007 All Rights Reserved/Copyright 2008 All Rights Reserved/

Použijte:

:s/Copyright \zs2007\ze All Rights Reserved/2008/

Použití aktuálního slova nebo zaregistruje

:%s//bar/gKaždou shodu posledního vyhledávacího vzoru nahraďte „bar“. Například můžete nejprve umístit kurzor na slovofooa poté stisknutím*toto slovo vyhledat. Výše uvedená náhrada by pak změnila všechna slova, která se přesně shodují s výrazem „foo“, s výrazem „bar“.:%s/foo/<c-r><c-w>/gNahraďte každý výskyt výrazu „foo“ slovem pod kurzorem.

<c-r><c-w>znamená, že stisknete Ctrl-R a poté Ctrl-W. Slovo pod kurzor bude vloženo, jako byste ho zadali.:%s/foo/<c-r><c-a>/gKaždý výskyt výrazu „foo“ nahraďte slovem pod kurzorem (oddělené mezerami).<c-r><c-a>znamená, že stisknete Ctrl-R a poté Ctrl-A. Slovo pod kurzor bude vloženo, jako byste ho zadali.:%s/foo/<c-r>a/gNahraďte každý výskyt výrazu „foo“ obsahem registru „a“.<c-r>aznamená, že stisknete Ctrl-R a potéa. Obsah registru „a“ bude vložen, jako byste jej zadali.:%s/foo/<c-r>0/gStejné jako výše, použití registru 0, který obsahuje text z nejnovějšího příkazu yank. Příkladem příkazů yank (copy) jeyi(kopírování textu v závorkách kolem kurzoru ay$kopírování textu z kurzoru na konec řádku. Po příkazu yank, který nezadal cílový registr, lze zkopírovaný text zadat stisknutím kláves Ctrl-R a poté0.:%s/foo/\=@a/gNahraďte každý výskyt výrazu „foo“ obsahem registru „a“.\=@aje odkaz na registraci „a“. Obsah registru „a“ se v příkazu nezobrazí. To je užitečné, pokud registr obsahuje mnoho řádků textu.:%s//<c-r>//gKaždou shodu posledního vyhledávacího vzoru nahraďte registrem/(poslední vyhledávací vzorec). Po stisknutí kláves Ctrl-R a potom/vložíte poslední vyhledávací vzor (a před provedením příkazu stisknutím klávesy Enter) můžete upravit text a provést požadovanou změnu.:%s/<c-r>*/bar/gNahradit všechny výskyty textu v systémové schránce (v*registru) barem (viz následující příklad, pokud je víceřádkový) . V některých systémech je pro vložení tohoto textu do*nutné vybrat text (ve Vimu nebo jiné aplikaci).:%s/<c-r>a/bar/gNahradit všechny výskyty textu v registru „a“ za „bar“.<c-r>aznamená, že stisknete Ctrl-R a potéa. Obsah registru „a“ bude vložen, jako byste jej zadali. Všechny nové řádky v registru „a“ jsou vloženy jako^Ma nejsou nalezeny. Hledání funguje, pokud je každý^Mručně nahrazen znakem „\ n“ (dva znaky: zpětné lomítko, „n“). Tuto náhradu lze provést, když zadáte příkaz::%s/<c-r>=substitute(@a,"\n","\\n","g")<CR>/bar/g"\n"(uvozovky) představuje nový řádek s jedním znakem;"\\n"(jednoduché uvozovky) představuje dvě zpětná lomítka, za nimiž následuje „n„.Funkcesubstitute()je hodnocena<c-r>=(Ctrl-R=) výrazovým registrem; nahradí každý nový řádek jediným zpětným lomítkem následovaným „n„.<CR>označuje, že stisknutím klávesy Enter dokončíte výraz=.:%s/<c-r>0/bar/gStejné jako výše, použití registru 0, který obsahuje text z nejnovějšího příkazu yank.

Viz Vložení registrů do příkazů pro vyhledávání nebo dvojtečku namísto použití schránky.

Další příklady

:%s/foo/bar/Na každém řádku nahraďte první výskyt „foo“ s „bar“.:%s/.*\zsfoo/bar/Na každém řádku nahraďte poslední výskyt výrazu „foo“ výrazem „bar“.:%s/\<foo\>//gNa každém řádku smažte všechny výskyty celého slova „foo“.:%s/\<foo\>.*//Na každém řádku smažte celé slovo „foo“ a veškerý následující text (na konec řádku).:%s/\<foo\>.\{5}//Na každém řádku smažte první výskyt celého slova „foo“ a následujících pět znaků.:%s/\<foo\>\zs.*//Na každém řádku smažte veškerý text za celým slovem „foo“ (na konec řádku).:%s/.*\<foo\>//Na každém řádku smažte celé slovo „foo“ a veškerý předchozí text (od začátku řádku).:%s/.*\ze\<foo\>//Na každém řádku smažte veškerý text před celým slovem „foo“ (od začátku řádku).:%s/.*\(\<foo\>\).*/\1/Na každém řádku smažte veškerý text před a za celým slovem „foo“.:%s/\<foo\(bar\)\@!/toto/gNa každém řádku nahraďte každý výskyt výrazu „foo“ (který začíná slovem a za ním není „bar“) výrazem „toto“.:s/^\(\w\)/\u\1/Pokud je pouze první znak na začátku aktuálního řádku malými písmeny, přepněte jej pomocí\una velká písmena (viz případ přepínání znaků ).:%s/\(.*\n\)\{5\}/&\r/Každých 5 řádků vložte prázdný řádek. Vzor hledá pětkrát (\{5\})\(.*\n\)(libovolný řádek včetně jeho konce). Náhrada je&(text, který byl nalezen), následovaný\r(nový řádek).:%s/\<foo\(\a*\)\>/\=len(add(list, submatch(1)))?submatch(0):submatch(0)/gZískejte seznam výsledků hledání. (seznam musí existovat) Nastaví příznakmodifiedz důvodu nahrazení, ale obsah se nezmění. Poznámka: S dostatečně nedávným Vimem (verze 7.3.627 nebo vyšší) to můžete zjednodušit na::%s/\<foo\(\a*\)\>/\=add(list, submatch(1))/gnTo má tu výhodu, že vyrovnávací paměť nebude označena jako upravená a žádná Vytvoří se extra stav zpět. Výraz v náhradní části je proveden v karanténě a není dovoleno měnit vyrovnávací paměť.

Zvláštní případy

Pro nahrazování vzorů odpovídajícím rozlišením malých a velkých písmen Michael Geddes “ Lze použít plugin keepcase, např .:

:%SubstituteCase/\cHello/goodBye/gNáhrada „Hello hello helLo HELLO“ za „Goodbye goodbye goodBye GOODBYE“

Pro změnu offsetů v souboru opravy (číslo řádku bloku), lze použít tento malý úryvek:

s/^@@ -\(\d\+\),\(\d\+\) +\(\d\+\),\(\d\+\) @@$/\="@@ -".eval(submatch(1)+offsetdiff).",".submatch(2)." +".eval(submatch(3)+offsetdiff).",".submatch(4)." @@"/g

Užitečné, když chceme odstranit některé bloky z patchů, aniž by patch musel stěžovat si na offsetové rozdíly.

Poznámka Měli byste se pokusit udělat výraz kompaktnějším, ale nevím jak, aniž byste měli možnost měnit nechtěné řádky.

Viz také: použití náhražky

  • 63 Aplikování náhražek na vizuální blok
  • 81 Snadné nahrazování znaků a řádků
  • 159 Ukládání stisknutí kláves Nahrazování a vyhledávání
  • 406 Alternativní oddělovače pro nahrazení příkaz
  • 438 Vyhledat a nahradit ve vizuálním výběru
  • 464 Vyhledat a nahradit slovo pod kurzorem
  • 479 Nahradit bez psaní
  • 573 Opakování náhrady z aktuální pozice kurzoru
  • 605 Nahraďte slovo vytrženým textem
  • 654 Speciální znaky v náhradním příkazu
  • 755 Použití výrazu v substituční příkaz
  • 808 Nahraďte vizuální blok textu jiným takovým blokem
  • 915 Použití g místo náhrady
  • 971 Nahraďte zvyšujícími se čísly
  • Přírůstek a nahrazení 1114 kroků
  • 1501 Nahradit poslední hledání

Viz také: Nahradit v náraznících / souborech

  • 382 Hledat a nahradit ve více vyrovnávacích pamětí
  • : help: substitute
  • : help cmdline-r úhly
  • : vzor nápovědy
  • : help „gdefault“
  • : nápověda k registraci

ÚKOLY
velká část „viz také“ může být užitečná pro čtenáře. Musíme spojit některé související tipy (ale výsledek příliš nezkomplikovat). Uvedl jsem čísla tipů, abych editorům pomohl udržet si přehled.

Chcete krátkou část uvádějící, že často jsou nejlepší jednoduché náhrady zpracováno vyhledáním a ruční změnou (a stisknutím . opakovat poslední změnu). Dále se můžete rozhodnout, jak změnit každou instanci.V části Kopírování nebo změna vyhledávacího dotazu najdete postup, kde můžete stisknutím n vyhledat další instanci a zadáním cs vyhledávací požadavek změnit na cokoli.

Došlo v poslední době ke změně toho, jak% s funguje? Nějak můžu použít < cr > a \ = @ jako náhražky, ale nemohu je použít jako hledání a nahrazení.

Pokud přesně popíšete, co děláte a co se stane, možná vám budu schopen pomoci, i když se budete ptát. JohnBeckett (diskuse) 02:15, 1. června 2019 (UTC)

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *