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/g
Finn hver forekomst av «foo» (bare i gjeldende linje), og erstatt den med «bar «.:%s/foo/bar/g
Finn hver forekomst av «foo» (i alle linjer), og erstatt den med «bar».:%s/foo/bar/gc
Endre hver «foo» til «bar», men be om bekreftelse først.:%s/\<foo\>/bar/gc
Endre bare hele ord som samsvarer nøyaktig med «foo» til «bar»; be om bekreftelse.:%s/foo/bar/gci
Endre hver «foo» (store og små bokstaver på grunn avi
-flagget) til «bar»; be om bekreftelse.:%s/foo\c/bar/gc
er det samme fordi\c
gjør søksaken ufølsom. Dette kan være ønsket etter å ha brukt:set noignorecase
for å gjøre søk store og små bokstaver (standard).:%s/foo/bar/gcI
Endre hver «foo» (store og små bokstaver på grunn avI
-flagget) til «bar»; be om bekreftelse.:%s/foo\C/bar/gc
er det samme fordi\C
gjør søket store og små bokstaver. Dette kan være ønsket etter å ha brukt:set ignorecase
for å 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\%V
atom 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 med
samsvarer 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}
så/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:
\r
er ny linje, er\n
en nullbyte (0x00).\&
er ampersand (& er teksten som samsvarer med søkemønsteret).\0
setter inn teksten som samsvarer med hele mønsteret\1
setter inn teksten til den første tilbakehenvisningen.\2
setter 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/g
Erstatt hvert treff i det siste søkemønsteret med «bar». For eksempel kan du først plassere markøren på ordetfoo
og 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>/g
Erstatt 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>/g
Erstatt 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/g
Erstatt hver forekomst av «foo» med innholdet i registeret «a».<c-r>a
betyr 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/g
Samme 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/g
Erstatt hver forekomst av «foo» med innholdet i registeret «a».\=@a
er en referanse for å registrere «a». Innholdet i registeret «a» vises ikke i kommandoen. Dette er nyttig hvis registeret inneholder mange tekstlinjer.:%s//<c-r>//g
Erstatt 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/g
Erstatt 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/g
Erstatt alle forekomster av teksten i registeret «a» med «bar».<c-r>a
betyr 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^M
og blir ikke funnet. Søket fungerer hvis hver^M
erstattes 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/g
Samme 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\>//g
På 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/g
På 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)/g
Få en liste over søkeresultater. (listen må eksistere) Angirmodified
flagget 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))/gn
Dette 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/g
Erstatt «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)