Utworzono 2001 · złożoność podstawowa · Wersja 6.0
Vim dostarcza :s
(zastąp) polecenie wyszukiwania i zamiany; ta wskazówka pokazuje przykłady zastępowania. W niektórych systemach gvim ma opcję Znajdź i zamień w menu Edycja (: help: promptrepl), jednak łatwiej jest użyć polecenia :s
ze względu na jego historię w wierszu poleceń i możliwość wstawiania tekst (na przykład słowo pod kursorem) do pól wyszukiwania lub zamień.
Podstawowe wyszukiwanie i zamiana
Polecenie :substitute
wyszukuje wzorzec tekstowy i zastępuje go ciągiem tekstowym. Jest wiele opcji, ale prawdopodobnie potrzebujesz tych:
:s/foo/bar/g
Znajdź każde wystąpienie „foo” (tylko w bieżącym wierszu) i zamień je na „bar ”.:%s/foo/bar/g
Znajdź każde wystąpienie „foo” (we wszystkich wierszach) i zamień je na „bar”.:%s/foo/bar/gc
Zmień każdy „foo” na „bar”, ale najpierw poproś o potwierdzenie.:%s/\<foo\>/bar/gc
Zmień tylko całe słowa dokładnie pasujące do „foo” na „bar”; poproś o potwierdzenie.:%s/foo/bar/gci
Zmień każde „foo” (bez rozróżniania wielkości liter ze względu na flagęi
) na „bar”; poproś o potwierdzenie.:%s/foo\c/bar/gc
jest taki sam, ponieważ\c
sprawia, że wielkość liter w wyszukiwaniu nie jest rozróżniana. Może to być pożądane po użyciu:set noignorecase
, aby podczas wyszukiwania rozróżniać wielkość liter (ustawienie domyślne).:%s/foo/bar/gcI
Zmień każdy „foo” (rozróżniana wielkość liter ze względu na flagęI
) na „bar”; poproś o potwierdzenie.:%s/foo\C/bar/gc
jest taki sam, ponieważ\C
uwzględnia wielkość liter w wyszukiwaniu. Może to być pożądane po użyciu:set ignorecase
, aby w wyszukiwaniu nie uwzględniać wielkości liter.
Flaga g
oznacza globalną – zmieniane jest każde wystąpienie w wierszu, a nie tylko pierwsze. Ta wskazówka zakłada domyślne ustawienie opcji "gdefault"
i "edcompatible"
(wyłączone), które wymagają, aby g
należy dołączyć flagę %s///g
, aby wykonać globalne zastąpienie. Używanie :set gdefault
powoduje zamieszanie, ponieważ wtedy %s///
jest globalne, a %s///g
nie (to znaczy , g
odwraca jego znaczenie).
Używając flagi c
, musisz potwierdzić dla każdego dopasowania, co do zrobienia. Vim wyświetli coś takiego: replace with foobar (y/n/a/q/l/^E/^Y)?
(gdzie foobar jest zamienną częścią polecenia :s/.../.../
. Możesz wpisać y
co oznacza podstawienie tego dopasowania, n
pominięcie tego dopasowania, a
zastąpienie tego i wszystkich pozostałych dopasowań ( „wszystkie” pozostałe dopasowania), q
, aby wyjść z polecenia, l
, aby zastąpić to dopasowanie i zakończyć (pomyśl o „ostatnim”), ^E
, aby przewinąć ekran w górę, przytrzymując klawisz Ctrl i naciskając E i ^Y
, aby przewinąć ekran w dół, przytrzymując klawisz Ctrl i naciskając Y. Jednak ostatnie dwie opcje są dostępne tylko wtedy, gdy Twój Vim jest normalnym, dużym lub ogromnym zbudowanym lub gdy funkcja insert_expand była włączona w czasie kompilacji (szukaj +insert_expand
na wyjściu of :version
).
Również podczas używania flagi c
, Vim przejdzie do t Najpierw znajdzie dopasowanie, zaczynając od góry bufora i poprosi o potwierdzenie wykonania zamiany na tym dopasowaniu. Vim stosuje grupę podświetlenia IncSearch
do dopasowanego tekstu, aby dać ci wizualną wskazówkę, na którym dopasowaniu działa (ustaw na reverse
domyślnie dla wszystkich trzech typów terminów od Vima 7.3). Dodatkowo, jeśli zostanie znalezionych więcej niż jedno dopasowanie i masz włączone podświetlanie wyszukiwania z :set hlsearch
, Vim podświetla pozostałe dopasowania za pomocą grupy podświetlenia Search
. Jeśli używasz podświetlania wyszukiwania, powinieneś upewnić się, że te dwie grupy wyróżnień są wizualnie różne. W przeciwnym razie nie będziesz w stanie łatwo stwierdzić, które dopasowanie Vim zachęca do zastąpienia.
Szczegóły
Zakres wyszukiwania:
Uwaga: Począwszy od Vim 7.3, podstawienia stosowane do zakresu zdefiniowanego przez znaki lub wizualną selekcję (która używa specjalnego typu znaków „< i „>) nie są domyślnie ograniczone przez pozycję kolumny znaków. Zamiast tego Vim stosuje podstawienie do całej linii, w której pojawia się każdy znacznik, chyba że\%V
atom jest używany we wzorcu, na przykład::"<,">s/\%Vfoo/bar/g
.
Podczas wyszukiwania:
.
,*
,\
,określa / collection. Zakresy znaków można przedstawić za pomocą
-
; na przykład litera a, b, c lub cyfrę 1 można dopasować do. Wyklucz kolekcję za pomocą
dopasowuje dowolny znak z wyjątkiem a, b, c lub 1.
\{#\}
jest używany do powtórzeń./foo.\{2\}
dopasuje foo i dwa następujące po nim znaki. Element\
nie jest wymagany na zamykającym}
, więc/foo.\{2}
zrobi to samo.\(foo\)
odwołuje się wstecz do foo. Nawiasy bez znaków ucieczki są dosłownie dopasowane. Tutaj\
jest wymagany dla zamykającego\)
.
W przypadku zamiany:
\r
to nowa linia,\n
jest bajtem zerowym (0x00).\&
to ampersand (& to tekst pasujący do wzorca wyszukiwania).\0
wstawia tekst dopasowany przez cały wzorzec\1
wstawia tekst pierwszego odniesienia wstecznego.\2
wstawia drugie odwołanie wsteczne i tak dalej.
Możesz użyć innych separatorów z podstawnikiem:
:s#http://www.example.com/index.html#http://example.com/#
Zapisz wpisywanie, używając \zs
i \ze
, aby ustawić początek i koniec wzorca. Na przykład zamiast:
:s/Copyright 2007 All Rights Reserved/Copyright 2008 All Rights Reserved/
Użyj:
:s/Copyright \zs2007\ze All Rights Reserved/2008/
Używając bieżącego słowa lub rejestry
:%s//bar/g
Zamień każde dopasowanie ostatniego wzorca wyszukiwania na „bar”. Na przykład możesz najpierw umieścić kursor na słowie
foo
, a następnie nacisnąć*
, aby wyszukać to słowo. Powyższy zamiennik zmieniłby wtedy wszystkie słowa dokładnie pasujące do „foo” na „bar”.:%s/foo/<c-r><c-w>/g
Zastąp każde wystąpienie „foo” słowem pod kursorem.<c-r><c-w>
oznacza, że naciskasz Ctrl-R, a następnie Ctrl-W. Słowo pod kursorem zostanie wstawione tak, jakbyś je wpisał.:%s/foo/<c-r><c-a>/g
Zamień każde wystąpienie „foo” na WORD pod kursorem (rozdzielone białymi znakami).<c-r><c-a>
oznacza, że naciskasz Ctrl-R, a następnie Ctrl-A. SŁOWO pod kursorem zostanie wstawione tak, jakbyś je wpisał.:%s/foo/<c-r>a/g
Zastąp każde wystąpienie „foo” zawartością rejestru „a”.<c-r>a
oznacza, że naciśniesz Ctrl-R, a następniea
. Zawartość rejestru „a” zostanie wstawiona tak, jakbyś ją wpisał.:%s/foo/<c-r>0/g
Tak samo jak powyżej, używając rejestru 0, który zawiera tekst z ostatniego polecenia yank. Przykładami poleceń yank (kopiuj) sąyi(
, które kopiują tekst w nawiasach wokół kursora, orazy$
, które kopiuje tekst z kursora do końca wiersza. Po poleceniu yank, które nie określało rejestru docelowego, skopiowany tekst można wprowadzić, naciskając Ctrl-R, a następnie0
.:%s/foo/\=@a/g
Zastąp każde wystąpienie „foo” zawartością rejestru „a”.\=@a
to odniesienie do rejestru „a”. Zawartość rejestru „a” nie jest wyświetlana w poleceniu. Jest to przydatne, jeśli rejestr zawiera wiele wierszy tekstu.:%s//<c-r>//g
Zamień każde dopasowanie ostatniego wzorca wyszukiwania na rejestr/
(ostatni wzorzec wyszukiwania). Po naciśnięciu Ctrl-R, a następnie/
w celu wstawienia ostatniego wzorca wyszukiwania (i przed naciśnięciem klawisza Enter w celu wykonania polecenia), można edytować tekst, aby wprowadzić dowolną wymaganą zmianę.:%s/<c-r>*/bar/g
Zamień wszystkie wystąpienia tekstu w schowku systemowym (w rejestrze*
) na „bar” (zobacz następny przykład, jeśli jest wielowierszowy) . W niektórych systemach wybranie tekstu (w Vimie lub innej aplikacji) jest wszystkim, czego potrzeba, aby umieścić ten tekst w rejestrze*
.:%s/<c-r>a/bar/g
Zamień wszystkie wystąpienia tekstu w rejestrze „a” na „bar”.<c-r>a
oznacza, że naciśniesz Ctrl-R, a następniea
. Zawartość rejestru „a” zostanie wstawiona tak, jakbyś ją wpisał. Wszelkie znaki nowej linii w rejestrze „a” są wstawiane jako^M
i nie są odnajdywane. Wyszukiwanie działa, jeśli każdy^M
jest ręcznie zastępowany przez „\ n” (dwa znaki: ukośnik odwrotny, „n”). To zastąpienie można wykonać podczas wpisywania polecenia::%s/<c-r>=substitute(@a,"\n","\\n","g")<CR>/bar/g
"\n"
(podwójne cudzysłowy) reprezentuje pojedynczy znak nowej linii;
"\\n"
(pojedyncze cudzysłowy) reprezentuje dwa ukośniki odwrotne, po których następuje „n
”.Funkcjasubstitute()
jest oceniana przez rejestr wyrażeń<c-r>=
(Ctrl-R=
); zastępuje każdy nowy wiersz pojedynczym ukośnikiem odwrotnym, po którym następuje „n
”.<CR>
wskazuje, że naciśniesz Enter, aby zakończyć wyrażenie=
.:%s/<c-r>0/bar/g
Tak samo jak powyżej, używając rejestru 0, który zawiera tekst z ostatniego polecenia yank.
Zobacz Wklejanie rejestrów w poleceniach wyszukiwania lub dwukropku zamiast korzystania ze schowka.
Dodatkowe przykłady
:%s/foo/bar/
W każdym wierszu zamień pierwsze wystąpienie „foo” z „bar”.:%s/.*\zsfoo/bar/
W każdym wierszu zamień ostatnie wystąpienie „foo” na „bar”.:%s/\<foo\>//g
W każdym wierszu usuń wszystkie wystąpienia całego słowa „foo”.:%s/\<foo\>.*//
W każdym wierszu usuń całe słowo „foo” i cały następujący tekst (do końca wiersza).:%s/\<foo\>.\{5}//
W każdym wierszu usuń pierwsze wystąpienie całego słowa „foo” i kolejnych pięciu znaków.:%s/\<foo\>\zs.*//
W każdym wierszu usuń cały tekst następujący po całym słowie „foo” (do końca wiersza).:%s/.*\<foo\>//
W każdym wierszu usuń całe słowo „foo” i cały poprzedzający go tekst (od początku wiersza).:%s/.*\ze\<foo\>//
W każdym wierszu usuń cały tekst poprzedzający całe słowo „foo” (od początku wiersza).:%s/.*\(\<foo\>\).*/\1/
W każdym wierszu usuń cały tekst poprzedzający i następujący po całym słowie „foo”.:%s/\<foo\(bar\)\@!/toto/g
W każdym wierszu zamień każde wystąpienie „foo” (rozpoczynającego słowo, po którym nie następuje „bar”), wyrażeniem „toto”.:s/^\(\w\)/\u\1/
Jeśli pierwszy znak na początku bieżącego wiersza to tylko mała litera, zmień ją na wielką, używając\u
(patrz zmiana wielkości liter ).:%s/\(.*\n\)\{5\}/&\r/
Wstaw pustą linię co 5 wierszy. Wzorzec wyszukuje hasło\(.*\n\)
(dowolny wiersz łącznie z jego zakończeniem) powtórzone pięć razy (\{5\}
). Zamiennik to&
(znaleziony tekst), a po nim\r
(nowa linia).:%s/\<foo\(\a*\)\>/\=len(add(list, submatch(1)))?submatch(0):submatch(0)/g
Pobierz listę wyników wyszukiwania. (lista musi istnieć) Ustawia flagęmodified
ze względu na zamianę, ale zawartość pozostaje niezmieniona. Uwaga: Mając wystarczająco świeżego Vima (wersja 7.3.627 lub nowsza), możesz uprościć to do::%s/\<foo\(\a*\)\>/\=add(list, submatch(1))/gn
Ma to tę zaletę, że bufor nie będzie oznaczony jako zmodyfikowany i nie tworzony jest dodatkowy stan cofnięcia. Wyrażenie w części zamiennej jest wykonywane w piaskownicy i nie może modyfikować bufora.
Przypadki specjalne
Aby zastąpić wzorce odpowiednim tekstem z uwzględnieniem wielkości liter, Michael Geddes ” Można użyć wtyczki keepcase, np .:
:%SubstituteCase/\cHello/goodBye/g
Zastąp „Hello hello helLo HELLO” słowem „Goodbye goodbye goodBye GOODBYE”
Do zmiany offsetów w pliku łatki (numer wiersza bloku), można użyć tego małego fragmentu:
s/^@@ -\(\d\+\),\(\d\+\) +\(\d\+\),\(\d\+\) @@$/\="@@ -".eval(submatch(1)+offsetdiff).",".submatch(2)." +".eval(submatch(3)+offsetdiff).",".submatch(4)." @@"/g
Przydatne, gdy chcemy usunąć niektóre bloki z łatki, bez konieczności jej narzekać na różnice w przesunięciach.
Uwaga Powinienem spróbować uczynić wyrażenie bardziej zwięzłym, ale nie wiem jak bez możliwości modyfikowania niechcianych linii.
Zobacz także: używanie podstawienia
- 63 Stosowanie substytutów w bloku wizualnym
- 81 Łatwe zastępowanie znaków i linii
- 159 Zapisywanie naciśnięć klawiszy Podstawianie i wyszukiwanie
- 406 Alternatywne ograniczniki do zamiany polecenie
- 438 Wyszukaj i zamień w zaznaczeniu wizualnym
- 464 Wyszukaj i zamień słowo pod kursorem
- 479 Zamień bez wpisywania
- 573 Powtarzanie substytutu z bieżącej pozycji kursora
- 605 Zastąp słowo z wyszarpanym tekstem
- 654 Znaki specjalne w poleceniu zamiany
- 755 Użycie wyrażenia w polecenie zamiany
- 808 Zastąp wizualny blok tekstu innym takim blokiem
- 915 Użycie g zamiast podstawiania
- 971 Zastępuj rosnącymi liczbami
- 1114 Krok zwiększ i zamień
- 1501 Zastąp ostatnie wyszukiwanie
Zobacz także: podstawianie w buforach / plikach
- 382 Szukaj i zamień w wielu buforach
- : help: substitute
- : help cmdline-r anges
- : wzorzec pomocy
- : help „gdefault”
- : rejestry pomocy
DO ZROBIENIA
duża sekcja „zobacz też” może być przydatna dla czytelników. Musimy scalić niektóre powiązane wskazówki (ale nie komplikuj rezultatu). Podałem numery wskazówek, aby pomóc redaktorom w śledzeniu.
Potrzebujesz krótkiej sekcji, w której wspomina się, że proste zamienniki są często najlepsze obsługiwane przez wyszukiwanie, a następnie ręcznie zmieniane (i naciskając .
, aby powtórzyć ostatnią zmianę). Dodatkowo możesz zdecydować, jak zmienić każdą instancję.Zobacz Kopiuj lub zmień trafienie wyszukiwania, aby znaleźć technikę, w której możesz nacisnąć n
, aby znaleźć następną instancję, a następnie wpisać cs
, aby zmienić trafienie wyszukiwania na cokolwiek.
Czy ostatnio nastąpiła zmiana w sposobie działania% s? W jakiś sposób mogę użyć zarówno < cr >, jak i \ = @ jako zamienników, ale nie mogę ich używać jako wyszukiwania i zamiany.
Jeśli dokładnie opiszesz, co robisz i co się dzieje, być może będę mógł pomóc, chociaż zobaczę zadawanie pytań. JohnBeckett (rozmowa) 02:15, 1 czerwca 2019 (UTC)