Mogę zrobić, :%s/<search_string>/<replace_string>/g
aby zamienić ciąg znaków w pliku lub :s/<search_string>/<replace_string>/
zamienić w bieżącym wierszu.
Jak mogę wybrać i zamienić słowa z wybranych linii w vimie?
Przykład: zamień tekst z linii 6-10
, 14-18
ale nie z 11-13
.
Odpowiedzi:
:&&
Komenda powtarza ostatnie zmiany z tymi samymi flagami. Możesz podać do niej dodatkowe zakresy (i połączyć dowolną ich liczbę):Jeśli masz wiele zakresów , wolę użyć pętli:
źródło
:6,10s/<search_string>/<replace_string>/g | :14,18&& | :20,23&& | :28,31&&
będzie również działać,for
pętla ułatwia zapamiętanie i wykonanie.:
Na kolejnych poleceń jest opcjonalne, btw, dzięki czemu można zaoszczędzić trochę więcej klawiszy.:&&
zaoszczędzi mi setki naciśnięć klawiszy tygodniowo. Dzięki!Zamień wszystko:
Znajdź każde wystąpienie „foo” (we wszystkich wierszach) i zamień je na „bar”.
Dla określonych linii:
Zmień każdy „foo” na „słupek” dla wszystkich linii od linii 6 do linii 10 włącznie.
źródło
/
, jest wskazanie flag dla operacji. To polecenie zwykle zastępuje pierwsze dopasowanie w linii; Zg
flagą zastąpi wszystkie wystąpienia.%
Rzecz działa! W przeciwnym razie jest to tylko pierwsze wystąpienie.%
=> uruchom to polecenie we wszystkich liniach.g
=> dopasuj wiele wystąpień w tej samej linii.Na marginesie, zamiast wpisywać numery linii, po prostu zaznacz linie, w których chcesz znaleźć / zamienić w jednym z trybów wizualnych:
VISUAL
tryb ( V)VISUAL BLOCK
tryb ( Ctrl+ V)VISUAL LINE
tryb ( Shift+ V, działa najlepiej w twoim przypadku)Po wybraniu linii do zastąpienia wpisz polecenie:
Zauważysz, że zakres
'<,'>
zostanie wstawiony automatycznie:Tutaj
'<
oznacza po prostu pierwszą podświetloną linię i'>
oznacza ostatnią podświetloną linię .Pamiętaj, że zachowanie może być nieoczekiwane w
NORMAL
trybie:'<
i'>
wskaż początek i koniec ostatniego podświetlenia wykonanego w jednym zVISUAL
trybów. Zamiast tego wNORMAL
trybie.
można użyć specjalnego numeru linii , co oznacza po prostu bieżącą linię . Dlatego możesz znaleźć / zamienić tylko w bieżącym wierszu w następujący sposób:Inną rzeczą do odnotowania jest to, że wstawienie sekundy
:
między zakresem a poleceniem znajdź / zamień nie szkodzi, innymi słowy, te polecenia będą nadal działać:źródło
Możesz to zrobić za pomocą dwóch sekwencji znajdź / zamień
Za drugim razem wszystko, co musisz dostosować, to zakres, więc zamiast wpisywać to wszystko, przypominam sobie ostatnie polecenie i edytuję tylko zakres
źródło
Jeśli jesteś zdezorientowany, które linie zostaną dotknięte, użyj poniżej
Zmień każdy „foo” na „pasek”, ale najpierw poproś o potwierdzenie. Naciśnij „y” dla „tak” i „n” dla „nie”. Po tym nie zapomnij zapisać
źródło
c
flagi oprócz określenia zakresu, więc:6,10s/<search_string>/<replace_string>/c
działa.c
oznaczaconfirm
. Używamc
flagi dość często, aby nie dopuścić do przypadkowego zastąpienia słów, o których nie myślałem, że one również tam istnieją.VI wyszukaj i zamień przykłady poleceń
Powiedzmy, że chcesz znaleźć słowo o nazwie „foo” i zastąpić je słowem „bar”.
Pierwszy
[Esc]
klawiszWpisz: (dwukropek), a następnie
%s/foo/bar/
naciśnij klawisz [Enter]:%s/foo/bar/
źródło
:%s/<search_string>/<replace_string>/g
polecenie zastąpi wszystkie wystąpienia w całym pliku. Nie do końca odpowiedź na pytanie, ale mimo to przydatna :)Nie musimy zawracać sobie głowy wprowadzaniem bieżącego numeru linii.
Jeśli chcesz zmienić siebie
foo
, abybar
dla bieżącej linii (.
) i dwóch kolejnych linii (+2
), po prostu zrobić:Jeśli chcesz, aby potwierdzić przed dokonaniem tych zmian należy wymienić
g
zgc
:źródło
:.,$s/foo/bar/gc
wyszukiwanie i zamiana, zaczynając od bieżącej linii aż do końca pliku.Wyszukaj i zamień
g => globalne wyszukiwanie
c => Najpierw poproś o potwierdzenie
i => Bez rozróżniania wielkości liter
Jeśli chcesz bezpośredniej zamiany bez potwierdzenia, użyj poniższego polecenia
Jeśli chcesz potwierdzić dla każdej zamiany, uruchom poniższe polecenie
Najpierw poproś o potwierdzenie, w wyszukiwaniu nie będzie rozróżniana wielkość liter.
źródło
Określanie zakresu poprzez selekcję wizualną jest w porządku, ale gdy są bardzo proste operacje na kilku liniach, które może wybrać operator, najlepiej zastosować te polecenia jako operatory.
Niestety nie można tego zrobić za pomocą standardowych poleceń vima. Możesz zrobić coś w rodzaju obejścia za pomocą! (filtr) operator i dowolny obiekt tekstowy. Na przykład, aby zastosować operację do akapitu, możesz wykonać:
Należy to rozumieć jako „Zastosuj operator! Wewnątrz akapitu”. Operator filtru uruchamia tryb poleceń i automatycznie wstawia zakres wierszy, po których następuje dosłowne „!” które możesz usunąć zaraz po. Jeśli zastosujesz to, do następującego akapitu:
Wynik po naciśnięciu „! Ap” wyglądałby następująco:
Jako „.” (punkt) oznacza bieżącą linię, zakres między bieżącą linią a 5 liniami później zostanie wykorzystany do operacji. Teraz możesz dodać polecenie zastępcze w taki sam sposób, jak poprzednio.
Złą stroną jest to, że nie jest to łatwiejsze niż wybranie tekstu dla drugiego operatora. Zaletą jest to, że może to powtórzyć wstawianie zakresu dla innych podobnych zakresów tekstu (w tym przypadku akapitów) o wyraźnie innym rozmiarze. To znaczy, jeśli później chcesz wybrać zakres większy akapit „.” do tego dobrze.
Ponadto, jeśli podoba Ci się pomysł użycia semantycznych obiektów tekstowych do wyboru zakresu operacji, możesz sprawdzić moją wtyczkę EXtend.vim, która może zrobić to samo, ale w łatwiejszy sposób.
źródło
Aby odpowiedzieć na to pytanie:
:40,50s/foo/bar/g
zamień foo na słupek w tych liniach między 40. i 50. linią (włącznie), po wykonaniu tego polecenia możesz obecnie znajdować się w dowolnej linii.
:50,40s/foo/bar/g
działa również, vim poprosi cię o potwierdzenie, a następnie wykona zamianę tak, jakbyś wprowadził pierwsze polecenie.
:,50s/foo/bar/g
zamień foo na pasek w tych liniach między linią, w której aktualnie się znajdujesz, a linią 50 (włącznie). (jeśli jesteś w linii PO 50-tej linii vim poprosi o potwierdzenie ponownie)
Aby wyjaśnić różnicę między vimem a vrapperową wtyczką Eclipse:
Zauważ, że w varpper
:,50s/foo/bar/g
polecenie NIE zadziała.:50,40s/foo/bar/g
będzie działać bez pytania o potwierdzenie.(Dla Vrapper w wersji 0.74.0 lub starszej).
źródło
Załóżmy, że chcesz zastąpić powyższe innymi informacjami.
COMMAND(:%s/\/sys\/sim\/source\/gm\/kg\/jl\/ls\/owow\/lsal/sys.pkg.mpu.umc.kdk./g)
W tym powyższe zostanie zastąpione przez (
sys.pkg.mpu.umc.kdk.
).źródło
%s
modyfikować dane wejściowe, ale chce wiedzieć, jak to zrobić „częściowo globalnie” (tzn. Jego specyfikacja to wiersze 6–10 i 14–18, ale nie wiersze 11– 13)./
, np!
,@
,_
::%s_/sys/sim/source/gm/kg/jl/ls/owow/lsal_sys.pkg.mpu.umc.kdk_g