Keresés és csere

Tipp 31 Nyomtatható monokönyv Előző Következő

létrehozva 2001 · összetettség alapja · 6.0 verzió

A Vim megadja a :s (helyettesítő) parancs keresésre és cserére; ez a tipp példákat mutat be a helyettesítésre. Bizonyos rendszerekben a gvim a Szerkesztés menüben található: Keresés és csere (: help: promptrepl), azonban a :s parancs használata egyszerűbb a parancssori előzmények és a beszúrási képesség miatt. szöveget (például a kurzor alatti szót) a keresés vagy a helyettesítés mezőkbe.

Alapvető keresés és csere

A :substitute parancs keres egy szövegmintát, és lecseréli azt egy szöveges karakterláncra. Számos lehetőség van, de valószínűleg ezeket szeretné:

:s/foo/bar/gKeresse meg a “foo” minden előfordulását (csak az aktuális sorban), és cserélje le a “bar” elemre “.:%s/foo/bar/gKeresse meg a “foo” minden előfordulását (minden sorban), és cserélje le a “bar” kifejezésre.:%s/foo/bar/gcMinden “foo” -ot “bar” -ra változtat, de először kérjen megerősítést.:%s/\<foo\>/bar/gcCsak a “foo” -nak pontosan megfelelő szavakat változtassa meg “bar” -ra; kérjen megerősítést.:%s/foo/bar/gciMinden “foo” -t (aizászló miatt nem érzékeny a kis- és nagybetűkre) változtasson “bar” -ra; kérjen megerősítést. A:%s/foo\c/bar/gcugyanaz, mert a\cérzéketlenné teszi a keresési esetet. Erre akkor lehet szükség, ha a:set noignorecasehasználatával a keresések megkülönböztetik a kis- és nagybetűket (alapértelmezett).:%s/foo/bar/gcIMinden “foo” -ot (aIzászló miatt megkülönbözteti a kis- és nagybetűket) “bar” -ra; kérjen megerősítést. A:%s/foo\C/bar/gcugyanaz, mert a\Cérzékenyvé teszi a keresést. Erre akkor lehet szükség, ha a:set ignorecasehasználatával érzéketlenné teszi a kereséseket.

A g zászló globális jelentést mutat – a sorban minden előfordulás megváltozik, nem csak az első. Ez a tipp feltételezi az alapértelmezett beállítást a "gdefault" és "edcompatible" beállításnál (ki), amely megköveteli, hogy a g flaget kell beilleszteni a %s///g be a globális helyettesítés elvégzéséhez. A :set gdefault használata zavart okoz, mert akkor a %s/// globális, míg a %s///g nem (vagyis , g megfordítja jelentését).

A c zászló használatakor minden mérkőzésre meg kell erősítenie, hogy mi csinálni. A Vim olyasmit fog kiadni, mint: replace with foobar (y/n/a/q/l/^E/^Y)? (ahol a foobar a :s/.../.../ parancs helyettesítő része. Gépelhet y ami azt jelenti, hogy helyettesíti ezt a mérkőzést, n hogy kihagyja ezt a mérkőzést, a ennek és az összes többi mérkőzésnek a helyettesítésére ( “az összes” hátralévő meccs), q a parancs kilépéséhez, l a meccs helyettesítéséhez és kilépéshez (gondoljunk az “utolsó” kifejezésre), ^E a képernyő felfelé görgetéséhez tartsa lenyomva a Ctrl billentyűt, majd nyomja le az E és ^Y gombokat a képernyő lefelé görgetéséhez a Ctrl billentyű lenyomásával és a Y. Az utóbbi két lehetőség azonban csak akkor érhető el, ha a Vim normál, nagy vagy hatalmas felépítésű, vagy az insert_expand funkció fordításkor engedélyezett volt (keresse meg a kimenetben a +insert_expand parancsot. :version).

A c zászló használatakor is a Vim a t-re ugrik először találja meg a puffer tetejétől kezdve, és megerősítést kér a csere végrehajtásához. A Vim a IncSearch kiemelő csoportot alkalmazza az egyező szövegre, hogy vizuális jelzést kapjon arról, hogy melyik egyezésen működik (állítsa reverse értékre alapértelmezés szerint mindhárom kifejezéstípusra a 7. Vim szerint). Ezenkívül, ha egynél több egyezés található, és engedélyezi a keresés kiemelését a :set hlsearch beállítással, a Vim kiemeli a fennmaradó mérkőzéseket a Search kiemelő csoporttal . Ha mégis keresési kiemelést használ, győződjön meg arról, hogy ez a két kiemelő csoport vizuálisan megkülönböztethető-e, különben nem fogja tudni könnyen megmondani, hogy a Vim melyik mérkőzést kéri a helyettesítésre.

Keresési tartomány:

Megjegyzés: A 7.3-as verziótól kezdve a jelölésekkel vagy vizuális kijelöléssel meghatározott tartományra alkalmazott helyettesítések (amelyek speciális típusú “< jelöléseket használnak és a “>) alapértelmezés szerint nincsenek korlátozva a jelölések oszloppozíciójával. Ehelyett a Vim alkalmazza a helyettesítést az egész sorra, amelyen az egyes jelek szerepelnek, hacsak a\%Vatomot használunk a mintában, például::"<,">s/\%Vfoo/bar/g.

Keresés közben:

.,*,\,megad egy / gyűjteményt. A karaktertartományokat egy-karakterrel lehet ábrázolni; például egy a, b, c betű vagy az 1-es szám megfeleltethető abetűvel. Negatívum, hogy abármely karakter egyezik az a, b, c vagy 1 kivételével.\{#\}az ismétléshez használatos. A/foo.\{2\}megegyezik a foo-val és a következő két karakterrel. A\nem szükséges a záró}oldalon, ezért/foo.\{2}ugyanazt fogja tenni. A\(foo\)visszaemlékezik a foo-ra. A menekülés nélküli zárójelek szó szerint egyeznek. Itt a\szükséges a\)záráshoz.

Cserénél:

\rújsor,\nnull bájt (0x00). A\&ampersand (& a keresési mintának megfelelő szöveg).\0beszúrja a teljes mintához illesztett szöveget\1beszúrja az első háttérreferencia szövegét.\2beszúrja a második háttérreferenciát stb.

Más elválasztókat is használhat helyettesítővel:

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

Gépelést menthet a \zs és a \ze a minta kezdetének és végének beállításához. Például:

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

Használja:

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

Az aktuális szó használata vagy regisztrál

:%s//bar/gAz utolsó keresési minta minden egyezését cserélje le “bar” -ra. Például először helyezze a kurzort a

fooszóra, majd nyomja meg a*szót a szó kereséséhez. A fenti helyettesítő ekkor az összes szót, amely pontosan megfelel a “foo” -nak, “bar” -ra változtatja.:%s/foo/<c-r><c-w>/gCserélje le a “foo” minden előfordulását a kurzor alatti szóra. A<c-r><c-w>azt jelenti, hogy megnyomja a Ctrl-R, majd a Ctrl-W billentyűkombinációt. A kurzor alatti szó úgy lesz beillesztve, mintha beírta volna.:%s/foo/<c-r><c-a>/gCserélje le a “foo” minden előfordulását a kurzor alatti szóra (szóközzel határolva). A<c-r><c-a>azt jelenti, hogy megnyomja a Ctrl-R, majd a Ctrl-A billentyűkombinációt. A kurzor alatti szó beillesztésre kerül, mintha beírta volna.:%s/foo/<c-r>a/gCserélje le a “foo” minden előfordulását az “a” regisztráció tartalmára. A<c-r>aazt jelenti, hogy megnyomja a Ctrl-R billentyűt, majda. Az “a” regiszter tartalma úgy kerül beillesztésre, mintha beírta volna.:%s/foo/<c-r>0/gUgyanaz, mint fent, a 0 regiszter használatával, amely a legutóbbi yank parancs szövegét tartalmazza. A yank (copy) parancsokra példák:yi(, amely a kurzor körül zárójelben lévő szöveget másolja, és ay$, amely a szöveget a kurzorról másolja. a sor végéig. Egy olyan rángatózó parancs után, amely nem adott meg célregisztert, a másolt szöveg a Ctrl-R, majd a0megnyomásával írható be.:%s/foo/\=@a/gCserélje le a “foo” minden előfordulását az “a” regisztráció tartalmára. Az\=@ahivatkozás az “a” regisztrációra. Az “a” regiszter tartalma nem jelenik meg a parancsban. Ez akkor hasznos, ha a regiszter sok soros szöveget tartalmaz.:%s//<c-r>//gCserélje le az utolsó keresési minta minden egyezését a/regiszterre (az utolsó keresési minta). Miután megnyomta a Ctrl-R billentyűt, majd/az utolsó keresési minta beszúrásához (és mielőtt az Enter billentyűt lenyomta a parancs végrehajtásához), szerkeszthette a szöveget a szükséges változtatások végrehajtása érdekében.:%s/<c-r>*/bar/gCserélje le a rendszer összes vágólapjának szövegét (a*regiszterben) “bar” -ra (lásd a következő példát, ha többsoros) . Egyes rendszereken csak a szöveg kiválasztása (a Vimben vagy egy másik alkalmazásban) szükséges ahhoz, hogy a szöveget a*regiszterbe helyezhesse.:%s/<c-r>a/bar/gCserélje le az “a” regiszterben szereplő szöveg minden előfordulását “bar” -ra. A<c-r>aazt jelenti, hogy megnyomja a Ctrl-R billentyűt, majda. Az “a” regiszter tartalma úgy kerül beillesztésre, mintha beírta volna. Az “a” regiszterben szereplő minden új sor^Mnéven kerül beillesztésre, és nem található. A keresés akkor működik, ha az egyes

^Melemeket manuálisan kicseréljük “\ n” -re (két karakter: visszavonás, “n”). Ez a helyettesítés a következő parancs beírásakor hajtható végre::%s/<c-r>=substitute(@a,"\n","\\n","g")<CR>/bar/gA"\n"(dupla idézőjelek) az egyetlen karakteres új sort jelöli; az"\\n"(egyes idézőjelek) két visszavonást jelent, amelyet “n” követ.Asubstitute()függvényt a<c-r>=(Ctrl-R=) kifejezésregiszter értékeli; minden új sort egyetlen visszavonással helyettesít, amelyet “n” követ. Az<CR>azt jelzi, hogy az Enter megnyomásával befejezi a=kifejezést.:%s/<c-r>0/bar/gUgyanaz, mint fent, a 0 regiszter használatával, amely a legutóbbi rángatózó parancs szövegét tartalmazza.

Lásd: Regiszterek beillesztése keresési vagy kettőspontos parancsokba a vágólap használata helyett.

További példák

:%s/foo/bar/Minden sorban cserélje le az első előfordulást. “foo” és “bar”.:%s/.*\zsfoo/bar/Minden sorban cserélje le a “foo” utolsó előfordulását a “bar” szóra.:%s/\<foo\>//gMinden sorban törölje a “foo” szó összes előfordulását.:%s/\<foo\>.*//Minden sorban törölje a “foo” szót és az összes következő szöveget (a sor végéig).:%s/\<foo\>.\{5}//Minden sorban törölje a “foo” szó első előfordulását és az azt követő öt karaktert.:%s/\<foo\>\zs.*//Minden sorban törölje az összes szöveget, a teljes “foo” szó után (a sor végéig).:%s/.*\<foo\>//Minden sorban törölje a “foo” szót és az azt megelőző összes szöveget (a sor elejétől).:%s/.*\ze\<foo\>//Minden sorban törölje az egész szöveget, amely megelőzi a “foo” szót (a sor elejétől).:%s/.*\(\<foo\>\).*/\1/Minden sorban törölje az egész szöveget, amely a “foo” szó előtt és után következik.:%s/\<foo\(bar\)\@!/toto/gMinden sorban cserélje le a “foo” (amely egy szót kezd és nem követi a “bar”) minden előfordulását “toto” -val.:s/^\(\w\)/\u\1/Ha az aktuális sor elején az első karakter csak kisbetű, váltsa át nagybetűre a\uhasználatával (lásd a karakterek váltási esetét) ).:%s/\(.*\n\)\{5\}/&\r/Helyezzen be egy üres sort 5 soronként. A minta ötször megismétli az\(.*\n\)(bármely vonal, beleértve a sor végét is) keresést (\{5\}). A helyettesítés&(a megtalált szöveg), majd\r(új sor).:%s/\<foo\(\a*\)\>/\=len(add(list, submatch(1)))?submatch(0):submatch(0)/gA keresési eredmények listájának lekérése. (a listának léteznie kell) Beállítja azmodifiedjelölőt a csere miatt, de a tartalom változatlan. Megjegyzés: Egy elég friss Vim (7.3.627 vagy újabb verzió) esetén ezt leegyszerűsítheti::%s/\<foo\(\a*\)\>/\=add(list, submatch(1))/gn

Ennek az az előnye, hogy a puffert nem jelölik módosítottként és nem extra visszavonási állapot jön létre. A csere részben lévő kifejezés a homokozóban fut, és nem engedélyezi a puffer módosítását.

Különleges esetek

A minták megfelelő kis- és nagybetű érzékeny szöveggel történő helyettesítésére Michael Geddes ” A keepcase plugin használható, például:

:%SubstituteCase/\cHello/goodBye/gA “Hello hello helLo HELLO” helyett “Goodbye goodbye goodBye GOODBYE”

A patch fájlban az eltolások megváltoztatásához (egy blokk sorszáma), ez a kis részlet használható:

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

Hasznos, ha néhány blokkot le akarunk vetni egy javításról, anélkül, hogy javításra lenne szükség panaszkodjon az eltolódási különbségekre.

Megjegyzés: Próbáljon kompaktabbá tenni a kifejezést, de ne tudja, hogyan, anélkül, hogy lehetősége lenne a nem kívánt sorok módosítására.

Lásd még: helyettesítő használata

  • 63 Helyettesítők alkalmazása vizuális blokkra
  • 81 Karakterek és sorok egyszerű helyettesítése
  • 159 Billentyűleütés mentése Helyettesítés és keresés
  • 406 Alternatív elválasztók a helyettesítéshez parancs
  • 438 Keresés és csere vizuális kijelölésben
  • 464 Keresse meg és cserélje ki a kurzor alatti szót
  • 479 Csere gépelés nélkül
  • 573 Helyettesítő ismétlése a kurzor aktuális helyzetéből
  • 605 Cseréljen szót egy rángatott szövegre
  • 654 Speciális karakterek a helyettesítő parancsban
  • 755 Kifejezés használata helyettesítő parancs
  • 808 A szöveg vizuális blokkjának cseréje egy másik ilyen blokkra
  • 915 g használata helyettesítés helyett
  • 971 Helyettesítés növekvő számokkal
  • 1114 lépés növekmény és cseréje
  • 1501 Helyettesítse az utolsó keresést

Lásd még: helyettesítés a pufferekben / fájlokban

  • 382 Keresés és cserélje le több pufferben
  • : help: helyettesítés
  • : help cmdline-r anges
  • : súgóminta
  • : help “gdefault”
  • : help regiszterek

TO DO
a nagy “lásd még” szakasz hasznos lehet az olvasók számára. Össze kell egyesítenünk néhány kapcsolódó tippet (de ne tegyük túl bonyolulttá az eredményt). A tippszámokat felvettem a szerkesztők nyomon követésére.

Szeretne egy rövid szakaszt, amelyben megemlíti, hogy gyakran az egyszerű helyettesítők a legjobbak a kereséssel, majd a manuális változtatással kezelhető (és a . megnyomásával megismételheti az utolsó változtatást). Ezenkívül eldöntheti az egyes példányok módosításának módját.Lásd: Olyan technika keresési találatának másolása vagy módosítása, ahol a n gomb megnyomásával megtalálhatja a következő példányt, majd a cs parancsot a keresési találat módosításához. bármihez.

Nemrég történt változás a% s működésével kapcsolatban? Valahogy mind a < cr >, mind a \ = @ -t helyettesítőként használhatom, de nem használhatom őket keresésként és helyettesítésként.

Ha pontosan leírja, mit csinál és mi történik, akkor talán tudok segíteni, bár látom a kérdéseket. JohnBeckett (vita) 02:15, 2019. június 1., UTC

Vélemény, hozzászólás?

Az email címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük