2013-11-15 22 views
172

Mogę wykonać :%s/<search_string>/<replace_string>/g, aby zastąpić ciąg znaków w pliku lub :s/<search_string>/<replace_string>/, aby zastąpić go w bieżącej linii.Znajdź i zamień ciągi znaków w vim na wielu liniach

Jak wybrać i zamienić słowa z linii selektywnych w vim?

Przykład: zamień tekst z linii 6-10, 14-18, ale nie od 11-13.

+1

Zobacz także [vim zaznacz/edytuj wiele niesekwencyjnych linii naraz] (http://stackoverflow.com/q/16439297). – glts

+0

http://vim.wikia.com/wiki/Search_and_replace – MrRolling

Odpowiedz

140

Komenda :&& powtarza ostatnią zamianę z tymi samymi flagami.Można dostarczyć dodatkowego zakresu (ów) do niego (i złączyć tyle, ile chcesz):

:6,10s/<search_string>/<replace_string>/g | 14,18&& 

Jeśli masz wiele zakresów choć wolałbym użyć pętli:

:for range in split('6,10 14,18')| exe range 's/<search_string>/<replace_string>/g' | endfor 
+32

+1 Dlaczego nawet przeszkadzam ... –

+1

Dzięki. Uwaga dla przyszłych użytkowników - ': 6,10s///g | : 14,18 && | : 20,23 && | : 28,31 && 'również będą działały, pętla' for' sprawi, że łatwiej ją zapamiętać i wykonać. –

+2

Cieszę się, że Ci się podoba! ':' W kolejnych poleceniach jest opcjonalne, btw, dzięki czemu można zapisać więcej klawiszy. –

26

można to zrobić z dwóch Znajdź/Zamień sekwencje

:6,10s/<search_string>/<replace_string>/g 
    :14,18s/<search_string>/<replace_string>/g 

Za drugim razem wszystko trzeba dostosować to zakres więc zamiast wpisywać to wszystko, chciałbym przypomnieć ostatnią komendę i edytować tylko wahają

151

Zamień wszystko:

:%s/foo/bar/g 

Znajdź każde wystąpienie 'foo' (na wszystkich liniach) i zastąpić go 'bar'.

Dla poszczególnych linii:

:6,10s/foo/bar/g 

Zmień każdy 'foo' do 'bar' dla wszystkich linii z linii 6 do linii 10 włącznie.

+0

A co z wierszem 14-18? – Bernhard

+0

Będziesz musiał ponownie użyć tego samego polecenia. Vim pamięta jak słusznie powiedział @Lieven .. Dzięki. –

+0

jaki jest cel/g tutaj? Przykro mi, że jestem nowy w Linuksie –

34

na marginesie, zamiast wpisywać numery linii, tylko podkreślenie linii gdzie chcesz znaleźć/zastąpić w jednym z trybów optyczny:

  • VISUAL tryb (V)
  • VISUAL BLOCK tryb (Ctrl + V)
  • VISUAL LINE tryb (Przesunięcie + V, najlepiej działa w Twoim przypadku)

Po wybraniu linii do zamiany, ty pe swoją komendę:

:s/<search_string>/<replace_string>/g 

Będziesz pamiętać, że zakres '<,'> zostanie wstawiony automatycznie dla Ciebie:

:'<,'>s/<search_string>/<replace_string>/g 

Tutaj '< oznacza po prostu podświetlony pierwszy wiersz i '> oznacza ostatni zaznaczony wiersz.

Należy zauważyć, że zachowanie może być nieoczekiwany gdy w NORMAL trybie: '< i '> punkt do rozpoczęcia i zakończenia ostatniego podświetleniem wykonanej w jednym z VISUAL trybach. Zamiast tego w trybie NORMAL można użyć specjalnego numeru linii ., który po prostu oznacza bieżącą linię. Stąd można znaleźć/wymienić tylko na aktualną linię:

:.s/<search_string>/<replace_string>/g 

Inną rzeczą, aby pamiętać, że wstawienie drugiego : w przedziale a find/polecenia robi nic złego, innymi słowy, te zastępują polecenia będą nadal działać:

:'<,'>:s/<search_string>/<replace_string>/g 
:.:s/<search_string>/<replace_string>/g 
+0

> Przykład: zamień tekst z wierszy 6-10, 14-18, ale nie z 11-13. - czy twoja odpowiedź nie odpowiada na to pytanie, prawda? – poige

-3
/sys/sim/source/gm/kg/jl/ls/owow/lsal 
/sys/sim/source/gm/kg/jl/ls/owow/lsal 
/sys/sim/source/gm/kg/jl/ls/owow/lsal 
/sys/sim/source/gm/kg/jl/ls/owow/lsal 
/sys/sim/source/gm/kg/jl/ls/owow/lsal 
/sys/sim/source/gm/kg/jl/ls/owow/lsal 
/sys/sim/source/gm/kg/jl/ls/owow/lsal 
/sys/sim/source/gm/kg/jl/ls/owow/lsal 

Załóżmy, że jeśli chcesz zastąpić wyżej z innej informacji.

COMMAND(:%s/\/sys\/sim\/source\/gm\/kg\/jl\/ls\/owow\/lsal/sys.pkg.mpu.umc.kdk./g)

W tym wyżej będzie się zastąpić (sys.pkg.mpu.umc.kdk.).

+0

Nie jestem pewien, czy to rzeczywiście odpowiada na pytanie. Z pytania wynika, że ​​osoba pytająca jest już świadoma, jak używać '% s' do modyfikowania danych wejściowych, ale chce wiedzieć, jak to zrobić" pół-globalnie "(tj. Jego specyfikacja to linie 6-10 i 14-18, ale nie w liniach 11-13). –

+1

Co to jest "COMMAND"? I cierpisz na [pochylony zespół wykałaczek] (https://en.wikipedia.org/wiki/Leaning_toothpick_syndrome). – Carpetsmoker

+0

Aby wyleczyć ten syndrom, możesz użyć innego znaku jako ogranicznika zamiast domyślnego '/', np. '!', '@', '_':':% s_/sys/sim/source/gm/kg/jl/ls/owow/lsal_sys.pkg.mpu.umc.kdk_g' – MortezaE

9

VI wyszukiwania i zamiany przykłady poleceń

Powiedzmy chcesz znaleźć słowo o nazwie „foo” i zastąpić „bar”.

pierwsze trafienie [Esc]

Typ: (dwukropek), a następnie% s/foo/bar/i wciśnij [Enter]. :% s/foo/bar/

+4

Twoje ':% s/Komenda //g' zastąpi wszystkie wystąpienia w całym pliku. Niezupełnie odpowiedź na pytanie, ale mimo to przydatne :) – tanius

Powiązane problemy