Søk og erstatt

Tips 31 Utskriftsvennlig Monobook Forrige Neste

opprettet 2001 · kompleksitet grunnleggende · versjon 6.0

Vim gir :s (erstatning) kommando for søk og erstat; dette tipset viser eksempler på hvordan man kan erstatte. På noen systemer har gvim Finn og erstatt på redigeringsmenyen (: help: promptrepl), men det er lettere å bruke kommandoen :s på grunn av kommandolinjeloggen og muligheten til å sette inn tekst (for eksempel ordet under markøren) til søke- eller erstatningsfeltene.

Grunnleggende søk og erstatt

Kommandoen :substitute søker etter et tekstmønster og erstatter det med en tekststreng. Det er mange alternativer, men dette er det du sannsynligvis vil ha:

:s/foo/bar/gFinn hver forekomst av «foo» (bare i gjeldende linje), og erstatt den med «bar «.:%s/foo/bar/gFinn hver forekomst av «foo» (i alle linjer), og erstatt den med «bar».:%s/foo/bar/gcEndre hver «foo» til «bar», men be om bekreftelse først.:%s/\<foo\>/bar/gcEndre bare hele ord som samsvarer nøyaktig med «foo» til «bar»; be om bekreftelse.:%s/foo/bar/gciEndre hver «foo» (store og små bokstaver på grunn avi-flagget) til «bar»; be om bekreftelse.:%s/foo\c/bar/gcer det samme fordi\cgjør søksaken ufølsom. Dette kan være ønsket etter å ha brukt:set noignorecasefor å gjøre søk store og små bokstaver (standard).:%s/foo/bar/gcIEndre hver «foo» (store og små bokstaver på grunn avI-flagget) til «bar»; be om bekreftelse.:%s/foo\C/bar/gcer det samme fordi\Cgjør søket store og små bokstaver. Dette kan være ønsket etter å ha brukt:set ignorecasefor å gjøre søk store og små bokstaver.

g -flagget betyr global – hver forekomst i linjen endres, i stedet for bare den første. Dette tipset forutsetter standardinnstillingen for "gdefault" og "edcompatible" alternativet (av), noe som krever at g flagg inkluderes i %s///g for å utføre en global erstatning. Bruk av :set gdefault skaper forvirring fordi da %s/// er global, mens %s///g ikke er (det vil si , g snur betydningen).

Når du bruker c -flagget, må du bekrefte for hver kamp hva å gjøre. Vim sender ut noe sånt som: replace with foobar (y/n/a/q/l/^E/^Y)? (der foobar er erstatningsdelen av :s/.../.../ -kommandoen. Du kan skrive y som betyr å erstatte denne kampen, n for å hoppe over denne kampen, a for å erstatte denne og alle gjenværende kamper ( «alle» gjenværende treff), q for å avslutte kommandoen, l for å erstatte denne kampen og avslutte (tenk på «siste»), ^E for å bla skjermen oppover ved å holde Ctrl-tasten og trykke E og ^Y for å bla skjermen ned ved å holde Ctrl-tasten og trykke Y. De to siste valgene er imidlertid bare tilgjengelige, hvis Vim er en normal, stor eller stor bygning eller insert_expand-funksjonen ble aktivert på kompileringstidspunktet (se etter +insert_expand i utgangen av :version).

Også når du bruker c -flagget, vil Vim hoppe til t den første kampen den finner fra toppen av bufferen og ber deg om bekreftelse for å utskifte den kampen. Vim bruker IncSearch høydepunktgruppen på den samsvarende teksten for å gi deg en visuell indikasjon på hvilken kamp den fungerer på (sett til reverse som standard for alle tre begrepstyper fra Vim 7.3). I tillegg, hvis det blir funnet mer enn ett treff, og du har søkeheving aktivert med :set hlsearch, fremhever Vim de resterende kampene med Search høydepunkt . Hvis du bruker søkeutheving, bør du sørge for at disse to uthevingsgruppene er visuelt forskjellige, eller at du ikke enkelt kan fortelle hvilken kamp Vim ber deg om å erstatte.

Detaljer

Søkeområde:

Merk: Fra og med Vim 7.3, erstatninger brukt på et område definert av merker eller et visuelt utvalg (som bruker en spesiell type merker «< og «>) er ikke begrenset av kolonneposisjonen til merkene som standard. I stedet bruker Vim erstatningen på hele linjen der hvert merke vises, med mindre\%Vatom brukes i mønsteret som::"<,">s/\%Vfoo/bar/g.

Når du søker:

.,*,\,angir en / samling. Tegnområder kan vises med-; for eksempel kan bokstaven a, b, c eller tallet 1 matches med. Negere samlingen medsamsvarer med hvilket som helst tegn unntatt a, b, c eller 1.\{#\}brukes til repetisjon./foo.\{2\}samsvarer med foo og de to følgende tegnene.\er ikke nødvendig på den avsluttende}/foo.\{2}vil gjøre det samme.\(foo\)gjør en backreference til foo. Parentes uten rømming samsvares bokstavelig talt. Her kreves\for å avslutte\).

Når du erstatter:

\rer ny linje, er\nen nullbyte (0x00).\&er ampersand (& er teksten som samsvarer med søkemønsteret).\0setter inn teksten som samsvarer med hele mønsteret\1setter inn teksten til den første tilbakehenvisningen.\2setter inn den andre bakreferansen, og så videre.

Du kan bruke andre skilletegn med erstatning:

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

Lagre skriving ved å bruke \zs og \ze for å angi start og slutt på et mønster. For eksempel, i stedet for:

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

Bruk:

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

Bruke gjeldende ord eller registrerer

:%s//bar/gErstatt hvert treff i det siste søkemønsteret med «bar». For eksempel kan du først plassere markøren på ordetfooog deretter trykke*for å søke etter det ordet. Ovenstående erstatning vil da endre alle ord som samsvarer nøyaktig med «foo» til «bar».

:%s/foo/<c-r><c-w>/gErstatt hver forekomst av «foo» med ordet under markøren.<c-r><c-w>betyr at du trykker på Ctrl-R og deretter Ctrl-W. Ordet under markøren blir satt inn som om du skrev det.:%s/foo/<c-r><c-a>/gErstatt hver forekomst av «foo» med WORD under markøren (avgrenset av mellomrom).<c-r><c-a>betyr at du trykker på Ctrl-R og deretter Ctrl-A. ORDET under markøren settes inn som om du skrev det.:%s/foo/<c-r>a/gErstatt hver forekomst av «foo» med innholdet i registeret «a».<c-r>abetyr at du trykker på Ctrl-R og derettera. Innholdet i registeret «a» blir satt inn som om du skrev det.:%s/foo/<c-r>0/gSamme som ovenfor, ved hjelp av register 0 som inneholder teksten fra den siste yank-kommandoen. Eksempler på yank (copy) -kommandoer eryi(som kopierer teksten i parentes rundt markøren, ogy$som kopierer teksten fra markøren til slutten av linjen. Etter en yank-kommando som ikke spesifiserte et destinasjonsregister, kan den kopierte teksten legges inn ved å trykke Ctrl-R og deretter0.:%s/foo/\=@a/gErstatt hver forekomst av «foo» med innholdet i registeret «a».\=@aer en referanse for å registrere «a». Innholdet i registeret «a» vises ikke i kommandoen. Dette er nyttig hvis registeret inneholder mange tekstlinjer.:%s//<c-r>//gErstatt hvert treff i det siste søkemønsteret med/-registeret (det siste søkemønsteret). Etter å ha trykket på Ctrl-R og deretter/for å sette inn det siste søkemønsteret (og før du trykker Enter for å utføre kommandoen), kan du redigere teksten for å foreta eventuelle nødvendige endringer.:%s/<c-r>*/bar/gErstatt alle forekomster av teksten i systemutklippstavlen (i*-registeret) med «bar» (se neste eksempel hvis flerlinje) . På noen systemer er det bare å velge tekst (i Vim eller et annet program) som kreves for å plassere teksten i*-registeret.:%s/<c-r>a/bar/gErstatt alle forekomster av teksten i registeret «a» med «bar».<c-r>abetyr at du trykker på Ctrl-R og derettera. Innholdet i registeret «a» blir satt inn som om du skrev det. Eventuelle nye linjer i register «a» settes inn som^Mog blir ikke funnet. Søket fungerer hvis hver^Merstattes manuelt med «\ n» (to tegn: tilbakeslag, «n»). Denne erstatningen kan utføres mens du skriver kommandoen::%s/<c-r>=substitute(@a,"\n","\\n","g")<CR>/bar/g"\n"(doble anførselstegn) representerer den nye linjen;"\\n"(enkelt anførselstegn) representerer to tilbakeslag skrått etterfulgt av «n«.substitute()-funksjonen blir evaluert av<c-r>=(Ctrl-R=) uttrykksregister; den erstatter hver ny linje med en tilbakeslag skråstrek etterfulgt av «

n«.<CR>indikerer at du trykker Enter for å fullføre=-uttrykket.:%s/<c-r>0/bar/gSamme som ovenfor, ved hjelp av register 0 som inneholder teksten fra den siste yank-kommandoen.

Se Lim inn registre i søke- eller kolon-kommandoer i stedet for å bruke utklippstavlen.

Ytterligere eksempler

:%s/foo/bar/På hver linje erstatter du den første forekomsten av «foo» med «bar».:%s/.*\zsfoo/bar/På hver linje erstatter du den siste forekomsten av «foo» med «bar».:%s/\<foo\>//gPå hver linje sletter du alle forekomster av hele ordet «foo».:%s/\<foo\>.*//På hver linje sletter du hele ordet «foo» og all tekst som følger (til slutten av linjen).:%s/\<foo\>.\{5}//På hver linje sletter du den første forekomsten av hele ordet «foo» og de følgende fem tegnene.:%s/\<foo\>\zs.*//På hver linje sletter du all tekst som følger hele ordet «foo» (til slutten av linjen).:%s/.*\<foo\>//På hver linje sletter du hele ordet «foo» og all foregående tekst (fra begynnelsen av linjen).:%s/.*\ze\<foo\>//På hver linje sletter du all teksten som går foran hele ordet «foo» (fra begynnelsen av linjen).:%s/.*\(\<foo\>\).*/\1/På hver linje sletter du all teksten som går foran og følger hele ordet «foo».:%s/\<foo\(bar\)\@!/toto/gPå hver linje erstatter du hver forekomst av «foo» (som starter et ord og ikke blir fulgt av «bar») med «toto».:s/^\(\w\)/\u\1/Hvis det første tegnet i begynnelsen av den aktuelle linjen bare er med små bokstaver, bytter du det til store bokstaver ved hjelp av\u).:%s/\(.*\n\)\{5\}/&\r/Sett inn en tom linje hver femte linje. Mønsteret søker etter\(.*\n\)(hvilken som helst linje inkludert linjeavslutning) gjentatt fem ganger (\{5\}). Erstatningen er&(teksten som ble funnet), etterfulgt av\r(ny linje).:%s/\<foo\(\a*\)\>/\=len(add(list, submatch(1)))?submatch(0):submatch(0)/gFå en liste over søkeresultater. (listen må eksistere) Angirmodifiedflagget på grunn av erstatningen, men innholdet er uendret. Merk: Med en nylig nok Vim (versjon 7.3.627 eller høyere), kan du forenkle dette til::%s/\<foo\(\a*\)\>/\=add(list, submatch(1))/gnDette har fordelen at bufferen ikke blir merket endret og ingen ekstra angre-tilstand opprettes. Uttrykket i erstatningsdelen utføres i sandkassen og har ikke lov til å endre bufferen.

Spesielle tilfeller

For å erstatte mønstre med tilsvarende store og små bokstaver, Michael Geddes » s Keepcase-plugin kan brukes, f.eks:

:%SubstituteCase/\cHello/goodBye/gErstatt «Hello hallo helLo HELLO» med «Goodbye farvel goodBye GOODBYE»

For å endre forskyvninger i en patch-fil (linjenummer i en blokk), kan denne lille snutten brukes:

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

Nyttig når vi vil fjerne noen blokker fra en lapp, uten at lappen trenger å klage på forskyvninger.

Merk Bør prøve å gjøre uttrykket mer kompakt, men vet ikke hvordan uten å ha mulighet til å endre uønskede linjer.

Se også: bruke erstatning

  • 63 Bruke erstatninger til en visuell blokk
  • 81 Erstatte enkelt tegn og linjer
  • 159 Tastetrykk Lagre Erstatning og søk
  • 406 Alternative skilletegn for erstatningen kommando
  • 438 Søk og erstatt i et visuelt valg
  • 464 Søk og erstatt ordet under markøren
  • 479 Erstatt uten å skrive
  • 573 Gjenta en erstatning fra gjeldende markørposisjon
  • 605 Erstatt et ord med den rykkede teksten
  • 654 Spesialtegn i erstatningskommandoen
  • 755 Bruke et uttrykk i erstatningskommando
  • 808 Erstatt en visuell tekstblokk med en annen slik blokk
  • 915 Bruker g i stedet for erstatning
  • 971 Erstatning med økende tall
  • 1114 Trinnøkning og erstatning
  • 1501 Erstatt siste søk

Se også: erstatning i buffere / filer

  • 382 Søk og erstatt i flere buffere
  • : hjelp: erstatning
  • : hjelp cmdline-r anges
  • : hjelpemønster
  • : hjelp «gdefault»
  • : hjelperegistre

Å GJØRE
The stor «se også» -delen kan være nyttig for leserne. Vi trenger å slå sammen noen av de relaterte tipsene (men ikke gjør resultatet for komplisert). Jeg inkluderte tipsene for å hjelpe redaktørene å holde rede på.

Vil ha en kort seksjon som nevner at enkle erstatninger ofte er best håndteres ved å søke og deretter endre manuelt (og trykke . for å gjenta den siste endringen). I tillegg kan du bestemme hvordan du vil endre hver forekomst.Se Kopier eller endre søketreff for en teknikk der du kan trykke n for å finne neste forekomst, og skriv deretter cs for å endre søketreffet til hva som helst.

Har det nylig vært en endring i hvordan% s fungerer? På en eller annen måte kan jeg bruke både < cr > og \ = @ som erstatninger, men jeg kan ikke bruke dem som søk og erstatninger.

Hvis du beskriver nøyaktig hva du gjør og hva som skjer, kan jeg kanskje hjelpe selv om jeg stiller spørsmål. JohnBeckett (diskusjon) 02:15, 1. juni 2019 (UTC)

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *