2014-09-15 22 views
6

Edytuję plik i chcę zmienić tylko określone słowo z innym słowem, ale tylko dla pierwszych N wystąpień. Próbowałem wielu poleceńVIM: Znajdowanie i zastępowanie pierwszych N wystąpień słowa

N :s/word/newword/

:%s/word/newword/count

i innych poleceń, które mogę znaleźć w Google. Ale żaden z nich nie działa.

EDYCJA: Polecenia Vim są preferowane. Ale można również użyć skryptu Vim. Nie mam żadnego doświadczenia w skryptowaniu vim.

+0

': s/słowo/newword/N 'jest jedyną poprawną komendą, ale zastąpiłoby to pierwsze wystąpienie w następnych N liniach. Jeśli użyjesz flagi/g, zastąpi ona wszystkie wystąpienia w następnych N liniach. Nie licz na dokładną liczbę. – Caek

Odpowiedz

13

Stosując zapis jednorazowy pozwala kontrolować dokładnie ile zmiany zrobić:

qq    " start recording in register q 
/foo<CR>  " search for next foo 
cgnbar<Esc> " change it to bar 
q    " end recording 
[email protected]   " play recording 11 times 

Zobacz :help recording i :help gn.

Innym sposobem, za pomocą :normal:

:norm! /foo<C-v><CR>cgnbar<C-v><Esc>  <-- should look like this: :norm! /foo^Mcgnbar^[ 
[email protected]: 

Zobacz :help :normal i :help @:.

Lub po prostu:

:/foo/|s//bar<CR> 
[email protected]: 
+0

Dodatkowe punkty za sprytne użycie 'gn'! – Ben

+0

@romainl Czy możesz wyjaśnić znaczenie każdej linii i atrybutu? – Ignited

+1

@Ignited, dodałem wskaźniki ': help '. Zapytaj mnie, jeśli masz pytania dotyczące konkretnych części mojej odpowiedzi. – romainl

1

nie jestem pewien o określenie pierwszych wystąpień n, ale często korzystają z tego polecenia:

:%s/word/newword/gc 

Vim pyta o potwierdzenie każdego wystąpienia word więc można selektywnie zmieniać niektóre, ale nie innych.

+1

Będą dość żmudne i duże szanse na błąd liczenia ludzi, gdy N jest duże – Ignited

+0

Tak, to prawda. Ale kiedy N nie jest duży, daje o wiele większą kontrolę nad tym, co się zmieniło. –

+0

Jest to również łatwiejsze do zrozumienia polecenie niż inne proponowane w tym wątku. – Moebius

9

Choć nieco dłużej, można zrobić:

:call feedkeys("yyyq") | %s/word/newword/gc 

zastąpić pierwsze 3 wystąpienia, a następnie zatrzymać. Możesz zmienić liczbę y, aby uzyskać więcej lub mniej zamienników. (Można również użyć n, aby pominąć niektóre)

Objaśnienie: podaje się y naciśnięcia klawiszy w opcji potwierdzenia zamiany /c.

+4

': wywołanie klawiszy (powtórz (" y ", 3)." Q ") | % s/test/toast/gc' dla określonej kwoty. Gdzie 3 to liczba wystąpień do zastąpienia. – Caek

+2

Bardzo sprytny pomysł. – romainl

+0

Zaśmiałem się trochę, gdy zdałem sobie sprawę, że nadal mam test/toast tam z testów, ale masz rację :) – Caek

2

My PatternsOnText plugin zapewnia (wśród wielu innych) polecenia, które ma odpowiedzi w postaci obu yyynyn lub 1-5:

:%SubstituteSelected/word/newword/g 1-5