Etsi ja korvaa

Vinkki 31 Tulostettava monokirja Edellinen Seuraava

luotu 2001 · monimutkaisuusperus · versio 6.0

Vim tarjoaa :s (korvaava) komento etsinnälle ja korvaamiselle; tämä vinkki näyttää esimerkkejä siitä, kuinka korvata. Joissakin järjestelmissä gvimillä on Etsi ja korvaa Muokkaa-valikossa (: help: promptrepl), mutta :s -komentoa on helpompi käyttää komentorivihistoriansa ja kykynsä lisätä teksti (esimerkiksi kohdistimen alla oleva sana) haku- tai korvauskenttiin.

Perushaku ja korvaa

Komento :substitute etsii tekstikuviota ja korvaa sen tekstimerkkijonolla. Vaihtoehtoja on monia, mutta todennäköisesti haluatkin nämä:

:s/foo/bar/gEtsi jokainen ”foo” esiintymä (vain nykyisellä rivillä) ja korvaa se ”bar” ”.:%s/foo/bar/gEtsi jokainen ”foo” esiintymä (kaikilla riveillä) ja korvaa se ”bar”: lla.:%s/foo/bar/gcVaihda jokaisesta ”foo”: sta ”bar”, mutta pyydä ensin vahvistusta.:%s/\<foo\>/bar/gcMuuta vain kokonaiset sanat, jotka vastaavat tarkalleen sanaa ”foo” sanaksi ”bar”; pyydä vahvistusta.:%s/foo/bar/gciVaihda kukin ”foo” (kirjainkoon merkitsemätöni-lipun vuoksi) palkkiin; pyydä vahvistusta.:%s/foo\c/bar/gcon sama, koska\ctekee hakukirjauksesta tunteeton. Tätä voidaan haluta käyttää:set noignorecase-toiminnon avulla hakujen kirjainkoon muuttamiseksi (oletus).:%s/foo/bar/gcIVaihda kukin ”foo” (isot ja pienet kirjaimetI-lipun vuoksi) palkkiin; pyydä vahvistusta.:%s/foo\C/bar/gcon sama, koska\Ctekee hakukirjasta merkitsevää. Tätä saatetaan haluta käyttää:set ignorecase-toiminnon avulla hakujen kirjainkoon muuttamiseksi.

Lippu g tarkoittaa globaalia – jokainen rivin esiintymä muuttuu eikä vain ensimmäinen. Tämä vihje olettaa oletusasetuksen vaihtoehdoille "gdefault" ja "edcompatible" (pois päältä), mikä edellyttää, että g -lippu sisällytetään osioon %s///g yleisen korvaavan tuotteen suorittamiseksi. :set gdefault -sovelluksen käyttö aiheuttaa sekaannusta, koska silloin %s/// on globaali, kun taas %s///g ei (eli , g muuttaa merkityksensä).

Kun käytät c -lippua, sinun on vahvistettava jokaiselle ottelulle, mitä tehdä. Vim antaa jotain tällaista: replace with foobar (y/n/a/q/l/^E/^Y)? (missä foobar on komennon :s/.../.../ korvaava osa. Voit kirjoittaa y mikä tarkoittaa tämän ottelun korvaamista, n ohittaa ottelu, a tämän ja kaikkien jäljellä olevien otteluiden korvaamiseksi ( ”kaikki” jäljellä olevat ottelut), q sulkeaksesi komennon, l korvaamaan tämä ottelu ja lopettamaan (ajattele ”viimeinen”), ^E vierittääksesi näyttöä ylöspäin pitämällä Ctrl-näppäintä painettuna ja painamalla E ja ^Y vierittääksesi näyttöä alaspäin pitämällä Ctrl-näppäintä painettuna Y. Kaksi viimeistä vaihtoehtoa ovat kuitenkin käytettävissä vain, jos Vim on normaalisti rakennettu, iso tai valtava tai jos insert_expand-ominaisuus oli käytössä kääntöhetkellä (etsi +insert_expand lähdöstä :version).

Myös c -lippua käytettäessä Vim hyppää kohtaan t hän löytää ensimmäisen ottelun, joka löytyy puskurin yläosasta, ja pyytää sinua vahvistamaan korvauksen suorittamisen kyseisessä ottelussa. Vim käyttää korostettua ryhmää IncSearch vastaavaan tekstiin saadaksesi visuaalisen vihjeen siitä, millaista tulosta se toimii (aseta arvoon reverse oletusarvoisesti kaikille kolmelle termityypille alkaen Vim 7.3). Lisäksi, jos löytyy useampi kuin yksi osuma ja haun korostaminen on käytössä kohdassa :set hlsearch, Vim korostaa jäljellä olevat ottelut korosteryhmällä Search . Jos käytät haun korostusta, varmista, että nämä kaksi korostusryhmää ovat visuaalisesti erillisiä tai et pysty kertomaan helposti, mikä ottelu Vim kehottaa sinua korvaamaan.

Tiedot

Hakualue:

Huomaa: Vim 7.3: stä alkaen korvaukset, joita käytetään merkkien tai visuaalisen valinnan määrittelemälle alueelle (joka käyttää erityyppisiä merkkejä ”< ja ”>) eivät rajoita oletusarvoisesti merkkien sarakkeiden sijaintia. Sen sijaan Vim käyttää korvausta koko rivillä, jolla kukin merkki esiintyy, ellei\%Vatomia käytetään kuviossa kuten::"<,">s/\%Vfoo/bar/g.

Haettaessa:

.,*,\,määrittää / kokoelman. Merkkialueet voidaan esittää merkillä-; esimerkiksi kirjain a, b, c tai numero 1 voidaan sovittaa-merkkiin. Negatiivista kokoelma siten, ettävastaa mitä tahansa merkkiä paitsi a, b, c tai 1.\{#\}käytetään toistamiseen./foo.\{2\}vastaa foo: ta ja kahta seuraavaa merkkiä.\ei vaadita sulkevalla}, joten/foo.\{2}tekee saman.\(foo\)viittaa foo: iin. Sulkeet, joissa ei ole pakoa, kirjaimellisesti sovitetaan yhteen. Täällä\vaaditaan sulkemiseen\).

Korvattaessa:

\ron uusi rivi,\non tyhjä tavu (0x00).\&on ampersandi (& on hakukuviota vastaava teksti).\0lisää koko kuvion mukaisen tekstin\1lisää ensimmäisen taustareunuksen tekstin.\2lisää toisen taaksepäin jne.

Voit käyttää muita erotimia korvaavalla tavalla:

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

Tallenna kirjoittaminen käyttämällä \zs ja \ze määrittää kuvion alku ja loppu. Esimerkiksi:

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

Käytä:

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

Nykyisen sanan käyttäminen tai rekisteröi

:%s//bar/gKorvaa viimeisen hakumallin kukin osuma ”bar”: lla. Voit esimerkiksi sijoittaa kohdistimen ensin sanaanfooja etsiä sitten sanaa painamalla*. Yllä oleva korvike muuttaisi sitten kaikki sanat, jotka vastaavat tarkalleen sanaa ”foo” sanaksi ”bar”.

:%s/foo/<c-r><c-w>/gKorvaa jokainen ”foo” esiintyminen kursorin alla olevalla sanalla.<c-r><c-w>tarkoittaa, että painat Ctrl-R ja sitten Ctrl-W. Kursorin alla oleva sana lisätään ikään kuin kirjoittaisit sen.:%s/foo/<c-r><c-a>/gKorvaa jokainen ”foo” esiintyminen WORD-näppäimellä kohdistimen alla (erotettu välilyönnillä).<c-r><c-a>tarkoittaa, että painat Ctrl-R ja sitten Ctrl-A. Kohdistimen alle oleva SANA lisätään ikään kuin kirjoittaisit sen.:%s/foo/<c-r>a/gKorvaa jokainen ”foo” esiintyminen rekisterin ”a” sisällöllä.<c-r>atarkoittaa, että painat Ctrl-R ja sittena. Rekisterin ”a” sisältö lisätään kuin kirjoittaisit sen.:%s/foo/<c-r>0/gSama kuin yllä, käyttämällä rekisteriä 0, joka sisältää viimeisimmän yank-komennon tekstin. Esimerkkejä jenkkikomennoista ovatyi(, joka kopioi tekstin kohdistimen ympärille sulkeisiin, jay$, joka kopioi tekstin kohdistimesta rivin loppuun. Yank-komennon jälkeen, joka ei määritä kohderekisteriä, kopioitu teksti voidaan syöttää painamalla Ctrl-R ja sitten0.:%s/foo/\=@a/gKorvaa jokainen ”foo” esiintyminen rekisterin ”a” sisällöllä.\=@aon viite ”a” -rekisteriin. Rekisterin ”a” sisältöä ei näytetä komennossa. Tästä on hyötyä, jos rekisteri sisältää useita tekstirivejä.:%s//<c-r>//gKorvaa viimeisen hakumallin kukin osuma/-rekisterillä (viimeinen hakumalli). Kun olet painanut Ctrl-R ja sitten/viimeisen hakukuvion lisäämiseksi (ja ennen Enterin suorittamista komennon suorittamiseksi), voit muokata tekstiä tekemään tarvittavat muutokset.:%s/<c-r>*/bar/gKorvaa kaikki järjestelmän leikepöydän (*-rekisterissä) tekstin esiintymät ”barilla” (katso seuraava esimerkki, jos monirivinen) . Joissakin järjestelmissä tekstin valitseminen (Vimissä tai muussa sovelluksessa) on kaikki mitä tarvitaan tekstin sijoittamiseksi*-rekisteriin.:%s/<c-r>a/bar/gKorvaa kaikki rekisterin ”a” tekstin esiintymät ”bar”: lla.<c-r>atarkoittaa, että painat Ctrl-R ja sittena. Rekisterin ”a” sisältö lisätään kuin kirjoittaisit sen. Kaikki rekisterin ”a” uudet rivit lisätään nimellä^M, eikä niitä löydy. Haku toimii, jos kukin^Mkorvataan manuaalisesti sanoilla \ n ”(kaksi merkkiä: taaksepäin viiva,” n ”). Tämä korvaus voidaan suorittaa, kun kirjoitat komennon::%s/<c-r>=substitute(@a,"\n","\\n","g")<CR>/bar/g"\n"(lainausmerkit) edustaa yhden merkin uutta riviä;"\\n"(yksittäiset lainausmerkit) edustaa kahta takaviivaa, jota seuraa ”n”.Toiminnonsubstitute()arvioi lausekerekisteri<c-r>=(Ctrl-R=); se korvaa jokaisen uuden rivin yhdellä takaviivalla, jota seuraa ”

n”.<CR>osoittaa, että lopetat lausekkeen=painamalla Enter-näppäintä.:%s/<c-r>0/bar/gSama kuin yllä, käyttämällä rekisteriä 0, joka sisältää viimeisimmän yank-komennon tekstin.

Katso kohtaa Rekisterien liittäminen haku- tai kaksoiskomennoihin leikepöydän käyttämisen sijaan.

Muita esimerkkejä

:%s/foo/bar/Korvaa jokaisella rivillä ensimmäinen esiintymä ”foo” ja ”bar”.:%s/.*\zsfoo/bar/Korvaa kullakin rivillä viimeinen ”foo” esiintyminen ”bar”: lla.:%s/\<foo\>//gPoista jokaisella rivillä kaikki sanan ”foo” kaikki esiintymät.:%s/\<foo\>.*//Poista jokaisella rivillä koko sana ”foo” ja kaikki seuraavat tekstit (rivin loppuun).:%s/\<foo\>.\{5}//Poista jokaisella rivillä koko sanan ”foo” ensimmäinen esiintymä ja seuraavat viisi merkkiä.:%s/\<foo\>\zs.*//Poista jokaisella rivillä kaikki teksti, joka seuraa koko sanaa ”foo” (rivin loppuun).:%s/.*\<foo\>//Poista jokaisella rivillä koko sana ”foo” ja kaikki edeltävät tekstit (rivin alusta).:%s/.*\ze\<foo\>//Poista jokaisella rivillä koko teksti ”foo” edeltävä teksti (rivin alusta).:%s/.*\(\<foo\>\).*/\1/Poista jokaisella rivillä koko teksti ”foo” edeltävä ja seuraava teksti.:%s/\<foo\(bar\)\@!/toto/gKorvaa jokaisella rivillä ”foo” (joka alkaa sanan ja jota ei seuraa ”palkki”) jokainen esiintymä sanalla ”toto”.:s/^\(\w\)/\u\1/Jos vain nykyisen rivin alussa oleva ensimmäinen merkki on pieni, vaihda se isoihin kirjaimiin käyttämällä\u(katso merkkien vaihtotapa ).:%s/\(.*\n\)\{5\}/&\r/Lisää tyhjä rivi 5 rivin välein. Kuvio etsii sanaa\(.*\n\)(mikä tahansa rivi ja sen rivin loppu) toistamalla viisi kertaa (\{5\}). Korvaava on&(löydetty teksti), jota seuraa\r(uusi rivi).:%s/\<foo\(\a*\)\>/\=len(add(list, submatch(1)))?submatch(0):submatch(0)/gHae luettelo hakutuloksista. (luettelon on oltava olemassa) Asettaa lipunmodifiedkorvaamisen takia, mutta sisältöä ei muuteta. Huomaa: Tarpeeksi äskettäisellä Vimillä (versio 7.3.627 tai uudempi) voit yksinkertaistaa tämän seuraavasti::%s/\<foo\(\a*\)\>/\=add(list, submatch(1))/gnTällä on se etu, että puskuria ei merkitä muokatuksi eikä ylimääräinen kumoustila luodaan. Korvaavan osan lauseke suoritetaan hiekkalaatikossa, eikä sen saa muuttaa puskuria.

Erityistapaukset

Kun kuviot korvataan vastaavalla kirjainkokoisella tekstillä, Michael Geddes ” s säilytyslaajennusta voidaan käyttää, esimerkiksi:

:%SubstituteCase/\cHello/goodBye/gKorvaa ”Hei hei helLo HELLO” sanalla ”Hyvästi hyvästi goodBye GOODBYE” (lohkon rivinumero), tätä pientä koodinpätkää voidaan käyttää:s/^@@ -\(\d\+\),\(\d\+\) +\(\d\+\),\(\d\+\) @@$/\="@@ -".eval(submatch(1)+offsetdiff).",".submatch(2)." +".eval(submatch(3)+offsetdiff).",".submatch(4)." @@"/g

Hyödyllinen, kun haluamme poistaa joitain lohkoja korjaustiedostosta ilman, että korjaustiedoston täytyy olla valittaa offset-eroista.

Huomaa Pitäisi yrittää tehdä lausekkeesta kompaktimpi, mutta älä tiedä miten ilman mahdollisuutta muokata ei-toivottuja viivoja.

Katso myös: korvikkeen käyttö

  • 63 Korvaavien aineiden käyttäminen visuaaliseen lohkoon
  • 81 Korvaa merkit ja rivit helposti
  • 159 Korvaamisen ja haun näppäimistön tallentaminen
  • 406 Vaihtoehtoiset erotimet korvaavalle komento
  • 438 Etsi ja korvaa visuaalisessa valinnassa
  • 464 Etsi ja korvaa sana kohdistimen alla
  • 479 Korvaa ilman kirjoittamista
  • 573 Korvikkeen toistaminen kohdistimen nykyisestä sijainnista
  • 605 Korvaa sana jenkkitekstillä
  • 654 Erikoismerkit korvauskomennossa
  • 755 Lausekkeen käyttäminen korvauskomento
  • 808 Korvaa visuaalinen tekstilohko toisella tällaisella lohkolla
  • 915 g: n käyttäminen korvaavan sijasta
  • 971 Korvaa kasvavilla numeroilla
  • 1114 Vaihe lisää ja korvaa
  • 1501 Korvaa viimeinen haku

Katso myös: korvaa puskurit / tiedostot

  • 382 Haku ja korvaa useissa puskureissa
  • : help: substitute
  • : help cmdline-r anges
  • : ohjekuvio
  • : help ”gdefault”
  • : help register

TO DO
suuri ”katso myös” -osio voi olla hyödyllinen lukijoille. Meidän on yhdistettävä joitain asiaan liittyviä vinkkejä (mutta älä tee tulosta liian monimutkaiseksi). Lisäsin vihjeiden numerot auttaakseni toimittajia seuraamaan.

Haluat lyhyen osan mainitsemalla, että yksinkertaiset korvaavat aineet ovat usein parhaita käsitellään etsimällä ja muuttamalla sitten manuaalisesti (ja painamalla . toistaaksesi viimeisen muutoksen). Lisäksi voit päättää, kuinka kukin esiintymä muutetaan.Katso Kopioi tai muuta hakutekniikkaa tekniikalle, jossa voit etsiä seuraavan esiintymän painamalla n ja kirjoittamalla sitten cs muuttaaksesi hakuhittiä mihin tahansa.

Onko% s toiminta muuttunut viime aikoina? Jotenkin voin käyttää sekä < cr > että \ = @ korvaavina, mutta en voi käyttää niitä hauina ja korvaavina.

Jos kuvailet tarkalleen mitä teet ja mitä tapahtuu, voin auttaa, vaikka näen kysymysten esittämisen.JohnBeckett (keskustelu) 02:15, 1. kesäkuuta 2019 (UTC)

Vastaa

Sähköpostiosoitettasi ei julkaista. Pakolliset kentät on merkitty *