Zoeken en vervangen

Tip 31 Afdrukbaar monoboek Vorige Volgende

gemaakt 2001 · complexiteit basis · versie 6.0

Vim biedt de :s (vervangend) commando voor zoeken en vervangen; deze tip toont voorbeelden van hoe te vervangen. Op sommige systemen heeft gvim Zoeken en vervangen in het menu Bewerken (: help: promptrepl), maar het is gemakkelijker om de opdracht :s te gebruiken vanwege de opdrachtregelgeschiedenis en de mogelijkheid om in te voegen tekst (bijvoorbeeld het woord onder de cursor) in de zoek- of vervangvelden.

Eenvoudig zoeken en vervangen

Het :substitute commando zoekt naar een tekstpatroon en vervangt dit door een tekstreeks. Er zijn veel opties, maar deze zijn wat u waarschijnlijk wilt:

:s/foo/bar/gZoek elk exemplaar van “foo” (alleen in de huidige regel) en vervang het door “bar “.:%s/foo/bar/gZoek elk exemplaar van “foo” (in alle regels) en vervang het door “bar”.:%s/foo/bar/gcVerander elke “foo” in “bar”, maar vraag eerst om bevestiging.:%s/\<foo\>/bar/gcVerander alleen hele woorden die exact overeenkomen met “foo” in “bar”; vraag om bevestiging.:%s/foo/bar/gciVerander elke “foo” (niet hoofdlettergevoelig vanwege deivlag) in “bar”; vraag om bevestiging.:%s/foo\c/bar/gcis hetzelfde omdat\cde zoekactie niet hoofdlettergevoelig maakt. Dit kan gewenst zijn na gebruik van:set noignorecaseom zoekopdrachten hoofdlettergevoelig te maken (standaard).:%s/foo/bar/gcIVerander elke “foo” (hoofdlettergevoelig vanwege deIvlag) in “bar”; vraag om bevestiging.:%s/foo\C/bar/gcis hetzelfde omdat\Cde zoekopdracht hoofdlettergevoelig maakt. Dit kan gewenst zijn na gebruik van:set ignorecaseom zoekopdrachten hoofdletterongevoelig te maken.

De vlag g betekent globaal – elke vermelding in de regel wordt gewijzigd, in plaats van alleen de eerste. Deze tip gaat uit van de standaardinstelling voor de "gdefault" en "edcompatible" optie (uit), waarvoor de g vlag worden opgenomen in %s///g om een globale vervanging uit te voeren. Het gebruik van :set gdefault schept verwarring omdat %s/// globaal is, terwijl %s///g dat niet is (dat wil zeggen , g keert de betekenis ervan om).

Wanneer u de vlag c gebruikt, moet u voor elke overeenkomst bevestigen wat Te doen. Vim geeft zoiets als: replace with foobar (y/n/a/q/l/^E/^Y)? (waarbij foobar het vervangende onderdeel is van de :s/.../.../ -opdracht. Je kunt wat betekent om deze overeenkomst te vervangen, n om deze overeenkomst over te slaan, a om deze en alle resterende overeenkomsten ( “all” resterende overeenkomsten), q om de opdracht te verlaten, l om deze overeenkomst te vervangen en af te sluiten (denk aan “last”), ^E om het scherm omhoog te scrollen door de Ctrl-toets ingedrukt te houden en op E te drukken en ^Y om het scherm omlaag te scrollen door de Ctrl-toets ingedrukt te houden en op te drukken Y. De laatste twee keuzes zijn echter alleen beschikbaar als je Vim normaal, groot of enorm is gebouwd of als de functie insert_expand tijdens het compileren was ingeschakeld (zoek naar +insert_expand in de uitvoer van :version).

Ook wanneer de vlag c wordt gebruikt, springt Vim naar t De eerste match vindt het beginnend vanaf de bovenkant van de buffer en vraagt u om een bevestiging om de match te vervangen. Vim past de IncSearch markeringsgroep toe op de overeenkomende tekst om u een visuele indicatie te geven van de match waarop deze werkt (ingesteld op reverse standaard voor alle drie termtypes vanaf Vim 7.3). Bovendien, als er meer dan één overeenkomst wordt gevonden en zoekmarkering is ingeschakeld met :set hlsearch, markeert Vim de resterende overeenkomsten met de Search markeringsgroep . Als je zoekmarkering gebruikt, moet je ervoor zorgen dat deze twee gemarkeerde groepen visueel van elkaar verschillen, anders kun je niet gemakkelijk zien welke match Vim je vraagt om te vervangen.

Details

Zoekbereik:

Opmerking: vanaf Vim 7.3 worden vervangingen toegepast op een bereik gedefinieerd door markeringen of een visuele selectie (die een speciaal type markeringen gebruikt “< en “>) worden niet standaard begrensd door de kolompositie van de markeringen. In plaats daarvan past Vim de vervanging toe op de hele regel waarop elke markering verschijnt, tenzij de\%Vatom wordt gebruikt in het patroon zoals::"<,">s/\%Vfoo/bar/g.

Bij het zoeken:

.,*,\,specificeert een / collectie. Tekenreeksen kunnen worden weergegeven met een-; een letter a, b, c of het cijfer 1 kan bijvoorbeeld worden vergeleken met. Negeer de verzameling metkomt overeen met elk teken behalve a, b, c of 1.\{#\}wordt gebruikt voor herhaling./foo.\{2\}komt overeen met foo en de twee volgende karakters. De\is niet vereist op de afsluitende}, dus/foo.\{2}zal hetzelfde doen.\(foo\)verwijst terug naar foo. Haakjes zonder ontsnappingen worden letterlijk op elkaar afgestemd. Hier is de\vereist voor het sluiten van\).

Bij het vervangen:

\ris een nieuwe regel,\nis een nul-byte (0x00).\&is een ampersand (& is de tekst die overeenkomt met het zoekpatroon).\0voegt de tekst in die overeenkomt met het volledige patroon\1voegt de tekst van de eerste terugverwijzing in.\2voegt de tweede terugverwijzing in, enzovoort.

U kunt andere scheidingstekens gebruiken met vervanging:

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

Sla typen op door \zs en \ze om het begin en einde van een patroon in te stellen. Bijvoorbeeld, in plaats van:

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

Gebruik:

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

Met het huidige woord of registers

:%s//bar/gVervang elke overeenkomst van het laatste zoekpatroon door “bar”. U kunt bijvoorbeeld eerst de cursor op het woordfooplaatsen en vervolgens op*drukken om naar dat woord te zoeken. De bovenstaande vervanging zou dan alle woorden veranderen die exact overeenkomen met “foo” in “bar”.:%s/foo/<c-r><c-w>/gVervang elke keer dat “foo” voorkomt door het woord onder de cursor.<c-r><c-w>betekent dat u op Ctrl-R en vervolgens op Ctrl-W drukt. Het woord onder de cursor wordt ingevoegd alsof u het hebt getypt.:%s/foo/<c-r><c-a>/gVervang elke keer dat “foo” voorkomt door het WOORD onder de cursor (gescheiden door witruimte).<c-r><c-a>betekent dat u op Ctrl-R en vervolgens op Ctrl-A drukt. Het WOORD onder de cursor wordt ingevoegd alsof u het hebt getypt.:%s/foo/<c-r>a/gVervang elke keer dat “foo” voorkomt door de inhoud van register “a”.<c-r>abetekent dat u op Ctrl-R en vervolgens opadrukt. De inhoud van register “a” wordt ingevoegd alsof u het hebt getypt.:%s/foo/<c-r>0/gHetzelfde als hierboven, met register 0 dat de tekst bevat van het meest recente yank-commando. Voorbeelden van yank-opdrachten (kopiëren) zijnyi(die de tekst tussen haakjes rond de cursor kopieert, eny$die de tekst van de cursor kopieert aan het einde van de regel. Na een yank-commando dat geen bestemmingsregister specificeerde, kan de gekopieerde tekst worden ingevoerd door op Ctrl-R en vervolgens op0te drukken.:%s/foo/\=@a/gVervang elke keer dat “foo” voorkomt door de inhoud van register “a”.\=@ais een verwijzing naar register “a”. De inhoud van register “a” wordt niet weergegeven in het commando. Dit is handig als het register veel regels tekst bevat.:%s//<c-r>//gVervang elke overeenkomst van het laatste zoekpatroon door het/register (het laatste zoekpatroon). Nadat u op Ctrl-R en vervolgens/hebt gedrukt om het laatste zoekpatroon in te voegen (en voordat u op Enter hebt gedrukt om de opdracht uit te voeren), kunt u de tekst bewerken om de gewenste wijziging aan te brengen.:%s/<c-r>*/bar/gVervang alle exemplaren van de tekst op het systeemklembord (in het*register) door “bar” (zie het volgende voorbeeld als er meerdere regels zijn) . Op sommige systemen is het selecteren van tekst (in Vim of een andere applicatie) alles wat nodig is om die tekst in het*register te plaatsen.:%s/<c-r>a/bar/gVervang alle exemplaren van de tekst in register “a” door “bar”.<c-r>abetekent dat u op Ctrl-R en vervolgens opadrukt. De inhoud van register “a” wordt ingevoegd alsof u het hebt getypt. Eventuele nieuwe regels in register “a” worden ingevoegd als

^Men worden niet gevonden. De zoekopdracht werkt als elke^Mhandmatig wordt vervangen door “\ n” (twee tekens: backslash, “n”). Deze vervanging kan worden uitgevoerd terwijl u de volgende opdracht typt::%s/<c-r>=substitute(@a,"\n","\\n","g")<CR>/bar/gDe"\n"(dubbele aanhalingstekens) vertegenwoordigt de nieuwe regel van één teken; de"\\n"(enkele aanhalingstekens) staat voor twee backslashes gevolgd door “n“.Desubstitute()functie wordt geëvalueerd door het<c-r>=(Ctrl-R=) expressieregister; het vervangt elke nieuwe regel door een enkele backslash gevolgd door “n“. De<CR>geeft aan dat u op Enter drukt om de=-expressie te voltooien.:%s/<c-r>0/bar/gHetzelfde als hierboven, met register 0 dat de tekst bevat van het meest recente yank-commando.

Zie Registers in zoek- of dubbele punt-opdrachten plakken in plaats van het klembord te gebruiken.

Aanvullende voorbeelden

:%s/foo/bar/Vervang op elke regel de eerste instantie van “foo” met “bar”.:%s/.*\zsfoo/bar/Vervang op elke regel de laatste keer dat “foo” voorkomt door “bar”.:%s/\<foo\>//gVerwijder op elke regel alle keren dat het hele woord “foo” voorkomt.:%s/\<foo\>.*//Verwijder op elke regel het hele woord “foo” en alle volgende tekst (tot het einde van de regel).:%s/\<foo\>.\{5}//Verwijder op elke regel de eerste keer dat het hele woord “foo” voorkomt en de volgende vijf tekens.:%s/\<foo\>\zs.*//Verwijder op elke regel alle tekst na het hele woord “foo” (tot het einde van de regel).:%s/.*\<foo\>//Verwijder op elke regel het hele woord “foo” en alle voorgaande tekst (vanaf het begin van de regel).:%s/.*\ze\<foo\>//Verwijder op elke regel alle tekst voorafgaand aan het hele woord “foo” (vanaf het begin van de regel).:%s/.*\(\<foo\>\).*/\1/Verwijder op elke regel alle tekst voorafgaand aan en volgend op het hele woord “foo”.:%s/\<foo\(bar\)\@!/toto/gVervang op elke regel elke vermelding van “foo” (dat een woord begint en niet wordt gevolgd door “bar”) door “toto”.:s/^\(\w\)/\u\1/Als het eerste teken aan het begin van de huidige regel alleen kleine letters is, zet het dan om naar hoofdletters met\u(zie omschakelen tussen hoofdletters en kleine letters ).:%s/\(.*\n\)\{5\}/&\r/Voeg elke 5 regels een lege regel in. Het patroon zoekt naar\(.*\n\)(elke regel inclusief het einde ervan) en wordt vijf keer herhaald (\{5\}). De vervanging is&(de tekst die is gevonden), gevolgd door\r(nieuwe regel).:%s/\<foo\(\a*\)\>/\=len(add(list, submatch(1)))?submatch(0):submatch(0)/gKrijg een lijst met zoekresultaten. (de lijst moet bestaan) Stelt de vlag

modifiedin vanwege de vervanging, maar de inhoud is ongewijzigd. Opmerking: met een voldoende recente Vim (versie 7.3.627 of hoger), kunt u dit vereenvoudigen tot::%s/\<foo\(\a*\)\>/\=add(list, submatch(1))/gnDit heeft het voordeel dat de buffer niet wordt gemarkeerd als gewijzigd en er wordt een extra undo-status gemaakt. De uitdrukking in het vervangende deel wordt uitgevoerd in de sandbox en mag de buffer niet wijzigen.

Speciale gevallen

Voor het vervangen van patronen door corresponderende hoofdlettergevoelige tekst, Michael Geddes ” De keepcase-plug-in kan worden gebruikt, bijv .:

:%SubstituteCase/\cHello/goodBye/gVervang “Hallo hallo hallo HELLO” door “Tot ziens, tot ziens, tot ziens, VAARWEL”

Voor het wijzigen van de offsets in een patchbestand (regelnummer van een blok), kan dit kleine fragment worden gebruikt:

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

Handig als we enkele blokken van een patch willen verwijderen, zonder dat patch klagen over offset-verschillen.

Opmerking Moet proberen de uitdrukking compacter te maken, maar weet niet hoe zonder de mogelijkheid te hebben om ongewenste regels te wijzigen.

Zie ook: substituut gebruiken

  • 63 Vervangingen toepassen op een visueel blok
  • 81 Vervang eenvoudig tekens en regels
  • 159 Toetsaanslag Opslaan Vervanging en zoeken
  • 406 Alternatieve scheidingstekens voor de vervanging commando
  • 438 Zoeken en vervangen in een visuele selectie
  • 464 Zoek en vervang het woord onder de cursor
  • 479 Vervangen zonder te typen
  • 573 Een vervanger herhalen vanaf de huidige cursorpositie
  • 605 Een woord vervangen door de gekopieerde tekst
  • 654 Speciale tekens in het vervangende commando
  • 755 Een uitdrukking gebruiken in vervangopdracht
  • 808 Vervang een visueel tekstblok door een ander dergelijk blok
  • 915 Gebruik g in plaats van vervangende
  • 971 Vervangen door oplopende getallen
  • 1114 Stap verhogen en vervangen
  • 1501 Laatste zoekopdracht vervangen

Zie ook: vervangen in buffers / bestanden

  • 382 Zoeken en vervang in meerdere buffers
  • : help: substitute
  • : help cmdline-r anges
  • : helppatroon
  • : help “gdefault”
  • : helpregisters

TE DOEN
De grote “zie ook” -sectie kan nuttig zijn voor lezers. We moeten enkele van de gerelateerde tips samenvoegen (maar maak het resultaat niet te complex). Ik heb de tipnummers toegevoegd om redacteuren te helpen bij te houden.

Wil je een korte sectie waarin wordt vermeld dat eenvoudige vervangers vaak het beste zijn afgehandeld door te zoeken en vervolgens handmatig te wijzigen (en op . te drukken om de laatste wijziging te herhalen). Bovendien kunt u beslissen hoe u elke instantie wilt wijzigen.Zie Zoektreffer kopiëren of wijzigen voor een techniek waarbij u op n kunt drukken om de volgende instantie te zoeken en typ vervolgens cs om de zoekopdracht te wijzigen naar wat dan ook.

Is er onlangs een verandering opgetreden in de manier waarop% s werkt? Op de een of andere manier kan ik beide < cr > en \ = @ als vervangers gebruiken, maar ik kan ze niet gebruiken als zoekopdrachten en vervangingen.

Als je precies beschrijft wat je doet en wat er gebeurt, kan ik misschien helpen, ook al zie ik vragen stellen. JohnBeckett (talk) 02:15, 1 juni 2019 (UTC)

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *