Căutare și înlocuire

Sfat 31 Monobook tipăribil Anterior Următor

creat 2001 · complexitate de bază · versiune 6.0

Vim furnizează :s (substitut) comandă pentru căutare și înlocuire; acest sfat prezintă exemple de înlocuire. Pe unele sisteme, gvim are Găsire și înlocuire în meniul Editare (: help: promptrepl), cu toate acestea este mai ușor să utilizați comanda :s datorită istoricului liniei de comandă și a capacității de inserare text (de exemplu, cuvântul de sub cursor) în câmpurile de căutare sau înlocuire.

Căutare de bază și înlocuire

Comanda :substitute caută un model de text și îl înlocuiește cu un șir de text. Există multe opțiuni, dar acestea sunt ceea ce probabil doriți:

:s/foo/bar/gGăsiți fiecare apariție a „foo” (numai în linia curentă) și înlocuiți-o cu „bar „.:%s/foo/bar/gGăsiți fiecare apariție a „foo” (în toate liniile) și înlocuiți-o cu „bar”.:%s/foo/bar/gcSchimbați fiecare „foo” în „bar”, dar solicitați mai întâi confirmarea.:%s/\<foo\>/bar/gcSchimbați numai cuvinte întregi care corespund exact „foo” la „bar”; cere confirmare.:%s/foo/bar/gciSchimbați fiecare „foo” (fără majuscule și minuscule datorită semnalizatoruluii) la „bar”; cere confirmare.:%s/foo\c/bar/gceste același lucru, deoarece\cface ca căutarea să fie insensibilă. Acest lucru poate fi dorit după utilizarea:set noignorecasepentru a face căutările sensibile la majuscule (majuscule).:%s/foo/bar/gcISchimbați fiecare „foo” (sensibil la majuscule și minuscule datorită semnalizatoruluiI) la „bar”; cere confirmare.:%s/foo\C/bar/gceste același lucru, deoarece\Cface ca sensibilitatea între majuscule și minuscule. Acest lucru poate fi dorit după utilizarea:set ignorecasepentru a face căutările nesensibile.

Semnalizatorul g înseamnă global – fiecare apariție din linie este modificată, mai degrabă decât prima. Acest sfat presupune setarea implicită pentru opțiunile "gdefault" și "edcompatible" (dezactivat), care necesită ca g pavilionul trebuie inclus în %s///g pentru a efectua un substitut global. Utilizarea :set gdefault creează confuzie deoarece atunci %s/// este global, în timp ce %s///g nu este (adică , g își inversează semnificația).

Când utilizați steagul c, trebuie să confirmați pentru fiecare potrivire ce a face. Vim va afișa ceva de genul: replace with foobar (y/n/a/q/l/^E/^Y)? (unde foobar este partea de înlocuire a comenzii :s/.../.../. Puteți tasta y ceea ce înseamnă să înlocuiți acest meci, n să omiteți acest meci, a să înlocuiți acest meci și toate celelalte meciuri ( „toate” potrivirile rămase), q pentru a părăsi comanda, l pentru a înlocui această potrivire și a renunța (gândiți-vă la „ultimul”), ^E pentru a derula ecranul sus ținând apăsată tasta Ctrl și apăsând E și ^Y pentru a derula ecranul în jos, ținând apăsată tasta Ctrl și apăsând Y. Cu toate acestea, ultimele două opțiuni sunt disponibile numai dacă Vim este o construcție normală, mare sau imensă sau dacă funcția insert_expand a fost activată la compilare (căutați +insert_expand în ieșire din :version).

De asemenea, când utilizați steagul c, Vim va sări la t primul meci îl găsește începând din partea de sus a bufferului și vă solicită confirmarea pentru a efectua înlocuirea acelui meci. Vim aplică grupul de evidențiere IncSearch textului potrivit pentru a vă oferi un indiciu vizual cu privire la ce potrivire funcționează (setat la reverse implicit pentru toate cele trei tipuri de termeni începând cu Vim 7.3). În plus, dacă se găsesc mai multe potriviri și aveți activată evidențierea căutării cu :set hlsearch, Vim evidențiază meciurile rămase cu grupul de evidențiere Search . Dacă utilizați evidențierea prin căutare, trebuie să vă asigurați că aceste două grupuri de evidențiere sunt vizual distincte sau nu veți putea să spuneți cu ușurință ce meci vă solicită Vim să înlocuiți.

Detalii

Interval de căutare:

Notă: începând cu Vim 7.3, înlocuiri aplicate unui interval definit de mărci sau de o selecție vizuală (care utilizează un tip special de mărci „< și „>) nu sunt delimitate în mod implicit de poziția coloanei marcajelor. În schimb, Vim aplică înlocuirea întregii linii pe care apare fiecare semn, cu excepția cazului în care\%Vatom este utilizat în modelul de genul::"<,">s/\%Vfoo/bar/g.

La căutare:

.,*,\,specifică o / colecție. Intervalele de caractere pot fi reprezentate cu un-; de exemplu, o literă a, b, c sau numărul 1 poate fi asortată cu. Anulați colecția cuse potrivește cu orice caracter, cu excepția a, b, c sau 1.\{#\}este utilizat pentru repetare./foo.\{2\}se va potrivi cu foo și cu cele două caractere următoare.\nu este obligatoriu la}de închidere, deci/foo.\{2}va face același lucru.\(foo\)face o referință înapoi la foo. Paranteze fără evadări sunt literalmente potrivite. Aici\este necesar pentru închiderea\).

La înlocuire:

\reste linie nouă,\neste un octet nul (0x00).\&are semnul negativ (& este textul care se potrivește cu modelul de căutare).\0inserează textul asociat cu întregul model\1inserează textul primei referințe anterioare.\2inserează a doua referință inversă și așa mai departe.

Puteți utiliza alți delimitatori cu substitut:

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

Salvați tastarea utilizând \zs și \ze pentru a seta începutul și sfârșitul unui model. De exemplu, în loc de:

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

Utilizați:

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

Folosind cuvântul curent sau registre

:%s//bar/gÎnlocuiți fiecare potrivire a ultimului model de căutare cu „bar”. De exemplu, ați putea plasa mai întâi cursorul pe cuvântul

fooapoi apăsați*pentru a căuta acel cuvânt. Înlocuitorul de mai sus ar schimba apoi toate cuvintele care corespund exact „foo” la „bar”.:%s/foo/<c-r><c-w>/gÎnlocuiți fiecare apariție a „foo” cu cuvântul aflat sub cursor.<c-r><c-w>înseamnă că apăsați Ctrl-R apoi Ctrl-W. Cuvântul de sub cursor va fi inserat de parcă l-ai fi tastat.:%s/foo/<c-r><c-a>/gÎnlocuiți fiecare apariție a „foo” cu CUVÂNT sub cursor (delimitat de spații albe).<c-r><c-a>înseamnă că apăsați Ctrl-R apoi Ctrl-A. CUVÂNTUL de sub cursor va fi inserat de parcă l-ai fi tastat.:%s/foo/<c-r>a/gÎnlocuiți fiecare apariție a „foo” cu conținutul registrului „a”.<c-r>aînseamnă că apăsați Ctrl-R apoia. Conținutul registrului „a” va fi inserat de parcă l-ați fi tastat.:%s/foo/<c-r>0/gLa fel ca mai sus, folosind registrul 0 care conține textul de la cea mai recentă comandă yank. Exemple de comenzi yank (copy) suntyi(care copiază textul din paranteze în jurul cursorului șiy$care copiază textul de la cursor până la capătul liniei. După o comandă yank care nu a specificat un registru de destinație, textul copiat poate fi introdus apăsând Ctrl-R apoi0.:%s/foo/\=@a/gÎnlocuiți fiecare apariție a „foo” cu conținutul registrului „a”.\=@aeste o referință pentru înregistrarea „a”. Conținutul registrului „a” nu este afișat în comandă. Acest lucru este util dacă registrul conține mai multe linii de text.:%s//<c-r>//gÎnlocuiți fiecare potrivire a ultimului model de căutare cu registrul/(ultimul model de căutare). După ce apăsați Ctrl-R, apoi/pentru a insera ultimul model de căutare (și înainte de a apăsa Enter pentru a efectua comanda), puteți edita textul pentru a face orice modificare necesară.:%s/<c-r>*/bar/gÎnlocuiți toate aparițiile textului din clipboardul sistemului (în registrul*) cu „bar” (a se vedea exemplul următor dacă este multiliniat) . Pe unele sisteme, selectarea textului (în Vim sau altă aplicație) este necesară pentru a plasa textul respectiv în registrul*.:%s/<c-r>a/bar/gÎnlocuiți toate aparițiile textului din registrul „a” cu „bara”.<c-r>aînseamnă că apăsați Ctrl-R apoia. Conținutul registrului „a” va fi inserat de parcă l-ați fi tastat. Orice linie nouă din registrul „a” este inserată ca^Mși nu este găsită. Căutarea funcționează dacă fiecare^Meste înlocuit manual cu „\ n” (două caractere: bară inversă, „n”). Această înlocuire poate fi efectuată în timp ce tastați comanda::%s/<c-r>=substitute(@a,"\n","\\n","g")<CR>/bar/g"\n"(ghilimele duble) reprezintă linia nouă cu un singur caracter;

"\\n"(ghilimele unice) reprezintă două bare oblice urmate de „n„.Funcțiasubstitute()este evaluată de registrul de expresie<c-r>=(Ctrl-R=); înlocuiește fiecare linie nouă cu o singură bară inversă urmată de „n„.<CR>indică faptul că apăsați Enter pentru a termina expresia=.:%s/<c-r>0/bar/gLa fel ca mai sus, folosind registrul 0 care conține textul de la cea mai recentă comandă yank.

Consultați Inserați registrele în comenzile de căutare sau colon în loc să utilizați clipboard-ul.

Exemple suplimentare

:%s/foo/bar/Pe fiecare linie, înlocuiți prima apariție de „foo” cu „bar”.:%s/.*\zsfoo/bar/Pe fiecare linie, înlocuiți ultima apariție a „foo” cu „bar”.:%s/\<foo\>//gPe fiecare linie, ștergeți toate aparițiile întregului cuvânt „foo”.:%s/\<foo\>.*//Pe fiecare linie, ștergeți întregul cuvânt „foo” și tot textul următor (până la sfârșitul liniei).:%s/\<foo\>.\{5}//Pe fiecare linie, ștergeți prima apariție a întregului cuvânt „foo” și următoarele cinci caractere.:%s/\<foo\>\zs.*//Pe fiecare linie, ștergeți tot textul urmând întregul cuvânt „foo” (până la sfârșitul liniei).:%s/.*\<foo\>//Pe fiecare linie, ștergeți întregul cuvânt „foo” și tot textul precedent (de la începutul liniei).:%s/.*\ze\<foo\>//Pe fiecare linie, ștergeți tot textul care precede întregul cuvânt „foo” (de la începutul liniei).:%s/.*\(\<foo\>\).*/\1/Pe fiecare linie, ștergeți tot textul precedent și următor întregului cuvânt „foo”.:%s/\<foo\(bar\)\@!/toto/gPe fiecare linie, înlocuiți fiecare apariție a „foo” (care începe un cuvânt și nu este urmată de „bar”) cu „toto”.:s/^\(\w\)/\u\1/Dacă primul caracter de la începutul liniei curente este doar cu litere mici, comutați-l cu majuscule utilizând\u(consultați comutarea majusculelor de caractere ).:%s/\(.*\n\)\{5\}/&\r/Introduceți o linie goală la fiecare 5 rânduri. Modelul caută\(.*\n\)(orice linie, inclusiv sfârșitul liniei sale), repetată de cinci ori (\{5\}). Înlocuitorul este&(textul găsit), urmat de\r(linie nouă).:%s/\<foo\(\a*\)\>/\=len(add(list, submatch(1)))?submatch(0):submatch(0)/gObțineți o listă cu rezultatele căutării. (lista trebuie să existe) Setează semnalizatorulmodified, din cauza înlocuirii, dar conținutul este neschimbat. Notă: Cu un Vim suficient de recent (versiunea 7.3.627 sau o versiune ulterioară), puteți simplifica acest lucru la::%s/\<foo\(\a*\)\>/\=add(list, submatch(1))/gnAcest lucru are avantajul că tamponul nu va fi marcat modificat și nu se creează o stare de anulare suplimentară. Expresia din partea de înlocuire este executată în sandbox și nu este permisă modificarea bufferului.

Cazuri speciale

Pentru înlocuirea modelelor cu textul corespunzător care face sensibilitatea la majuscule, Michael Geddes Pluginul Keepcase poate fi folosit, de exemplu:

:%SubstituteCase/\cHello/goodBye/gÎnlocuiți „Bună ziua Bună ziua Bună ziua Bună ziua” cu „La revedere la revedere la revedere la revedere”

Pentru schimbarea compensărilor într-un fișier patch (numărul de linie al unui bloc), acest mic fragment poate fi folosit:

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

Util atunci când vrem să scoatem câteva blocuri dintr-un patch, fără ca patch-ul să fie plângeți-vă de diferențele de compensare.

Notă Ar trebui să încercați să faceți expresia mai compactă, dar nu știți cum, fără a avea posibilitatea de a modifica liniile nedorite.

A se vedea, de asemenea: folosind substitut

  • 63 Aplicarea înlocuitorilor la un bloc vizual
  • 81 Înlocuirea cu ușurință a caracterelor și liniilor
  • 159 Salvarea tastelor Înlocuirea și căutarea
  • 406 Delimitatori alternativi pentru înlocuire comanda
  • 438 Căutare și înlocuire într-o selecție vizuală
  • 464 Căutare și înlocuire a cuvântului de sub cursor
  • 479 Înlocuire fără tastare
  • 573 Repetarea unui înlocuitor din poziția curentă a cursorului
  • 605 Înlocuiți un cuvânt cu textul extras
  • 654 Caracterele speciale din comanda de înlocuire
  • 755 Utilizarea unei expresii în comanda de înlocuire
  • 808 Înlocuiți un bloc vizual de text cu un alt astfel de bloc
  • 915 Folosind g în loc de înlocuire
  • 971 Înlocuiți cu numere incrementale
  • 1114 Creșteți pasul și înlocuiți
  • 1501 Înlocuiți ultima căutare

Vedeți și: înlocuiți în tampoane / fișiere

  • 382 Căutați și înlocuiți în mai multe buffere
  • : help: substitut
  • : help cmdline-r anges
  • : model de ajutor
  • : help „gdefault”
  • : registri de ajutor

DE FĂCUT
secțiunea mare „vezi și” poate fi utilă cititorilor. Trebuie să îmbinăm câteva dintre sfaturile aferente (dar nu faceți rezultatul prea complex). Am inclus numerele de sfaturi pentru a ajuta editorii să țină evidența.

Vrei o scurtă secțiune menționând că înlocuitorii simpli sunt adesea cei mai buni gestionate prin căutare, apoi schimbare manuală (și apăsarea . pentru a repeta ultima modificare). În plus, puteți decide cum să schimbați fiecare instanță.Consultați Copierea sau modificarea accesării căutării pentru o tehnică în care puteți apăsa n pentru a găsi următoarea instanță, apoi tastați cs pentru a schimba accesarea căutării la orice.

A existat recent o schimbare cu modul în care funcționează% s? Cumva, pot folosi atât < cr >, cât și \ = @ ca înlocuitoare, dar nu le pot folosi ca căutări și înlocuiri.

Dacă descrieți exact ce faceți și ce se întâmplă, aș putea să vă ajut, deși văd întrebări. JohnBeckett (discuție) 02:15, 1 iunie 2019 (UTC)

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *