Mam kilka linii w pliku i chciałbym skopiować każdą linię 11 razy (zamieniając każdą linię w 12 linii) i zwiększać ostatnią „1” w każdej linii, tak aby 12 linii miało „1” do „ 12 ”, gdzie początkowo była„ 1 ”. W każdej linii mogą występować inne wystąpienia „1”, ale „1”, które chcę zwiększyć, będzie zawsze ostatnim wystąpieniem w każdej linii. Innym sposobem spojrzenia na to jest to, że ostatnie „1” jest zawsze po „/ nt /” - jak w „/ nt / 1” (i zawsze będzie to jedyne wystąpienie „/ nt / 1” w każdej linii) .
Na przykład, jeśli mam:
1stlineblahblahblah/nt/1blah
2ndlineblahblahblah/nt/1blah
3rdlineblahblahblah/nt/1blah
Chcę to przekształcić w:
1stlineblahblahblah/nt/1blah
1stlineblahblahblah/nt/2blah
1stlineblahblahblah/nt/3blah
1stlineblahblahblah/nt/4blah
1stlineblahblahblah/nt/5blah
1stlineblahblahblah/nt/6blah
1stlineblahblahblah/nt/7blah
1stlineblahblahblah/nt/8blah
1stlineblahblahblah/nt/9blah
1stlineblahblahblah/nt/10blah
1stlineblahblahblah/nt/11blah
1stlineblahblahblah/nt/12blah
2ndlineblahblahblah/nt/1blah
2ndlineblahblahblah/nt/2blah
2ndlineblahblahblah/nt/3blah
...
Wcześniej znalazłem polecenie:
:for i in range(0,12) | put ='1stlineblahblahblah/nt/'.i.'blah' | endfor
działa w tym celu, ale musiałbym ręcznie uruchomić to polecenie dla każdej linii i sam wpisać każdą linię (lub skopiować i wkleić). Czy istnieje sposób na pobranie linii, które są już w pliku, i po prostu uruchom jedno polecenie, które zamienia każdą linię na dwanaście, w sposób, który opisałem?
Z góry dziękuję wszystkim, którzy mogą mi w tym pomóc. Chciałem też zauważyć, że jest to moje drugie pytanie tutaj i cieszyłem się, że otrzymałem kilka szybkich i skutecznych rozwiązań dla mojego pierwszego pytania, za które byłem najbardziej wdzięczny.
źródło
Możesz to zrobić przez
global
polecenia ex wykonać makro n liczbę razy dla każdej linii w pliku.Po zarejestrowaniu makra cofnij zmiany dokonane podczas nagrywania, w przeciwnym razie pojawi się n + 1 dodatkowych linii dla pierwszej linii oraz n dla kolejnych linii.
Zapisz makro do
a
rejestru za pomocąZapisuje do register
a
(qa...q
) następujące polecenie:yyp
: zduplikuj bieżącą linię$
: przejście do końca linii?\d<CR>
: wyszukaj wstecz pojedynczą cyfrę<C-A>
: przyrost cyfry pod kursorem o jedenPo zarejestrowaniu makra usuń zmiany dokonane podczas jego rejestrowania poprzez cofnięcie (
uu
) lub usunięcie bieżącej linii (dd
). Następnie powtórz makro11
(lub dowolną liczbę) razy dla każdej linii w pliku za pomocą polecenia global:źródło
Dwie drogi:
Użyj makra!
Począwszy od
Z kursorem w pierwszym wierszu
Co robi:
qq
Rozpocznij rejestrowanie makra w rejestrze qyyp
szarpnij bieżącą linię i wklej poniżej$?\d<CR>
Przejdź do końca linii i znajdź pierwszą cyfrę, patrząc wstecz<Ctrl-a>
Zwiększ liczbęq
Zatrzymaj rejestrowanie makra.To pozostawia Ci:
Z kursorem w drugim wierszu. Po prostu powtórz to makro tyle razy, ile chcesz (na przykład powtórz je dziesięć razy za pomocą 10 @ q). Jeśli chcesz zautomatyzować ten proces dla każdej linii, wykonaj go globalnie dla każdej linii:
:g//normal 11@q
Alternatywnie, z nowszą wersją vima: Wklej wybraną linię jednak wiele razy, blok wizualny wybierz cyfrę, którą chcesz zwiększyć, i naciśnij
g <Ctrl-a>
. Powinno to zwiększać wszystkie liczby w bloku wizualnym, jak chcesz. Jest to jednak proces bardziej ręczny.źródło
g <c-a>
drodze. Dzięki za udostępnienie.Uważam, że najłatwiej jest używać makr do takich zadań. Po prostu zacznij rejestrować makro z
q
+ nazwą rejestru i wykonaj zadanie raz. Widzę tutaj jedno powtarzalne zadanie:Teraz zapisz wymagane naciśnięcia klawiszy, aby się zarejestrować
a
, w trybie normalnym:Usuń wiersz ponownie, aby sprawdzić, czy wykonanie makra 11 razy daje właściwy wynik dla jednej linii:
To robi! Cofnijmy więc ponownie i zautomatyzujmy cały proces w drugim makrze
b
:Teraz możesz wykonać
@b
do końca pliku i powinien on wygenerować pożądany wynik. Brzmi skomplikowanie, ale tak naprawdę nie jest tak, gdy przyzwyczaisz się do typowych wzorców edycji.źródło
qaVyp$b<c-a>
. Lub lepiej, po prostuqayyp$b<c-a>
.qqyyp$?\d<CR><Ctrl-a>q
@fruglemonkey i @jjaderberg jest lepsze, ponieważ wyszukuje ostatni numer. Zmienię go dla kompletności.Zapisz następujące makro i użyj go dla każdej linii:
Główną różnicą w porównaniu z innymi odpowiedziami jest to, że korzysta się z
g<C-a>
wyboru kolumny, który zwiększa każdą linię o inną liczbę. Sprawdź:help v_g_CTRL-A
więcej informacji. Użyłem również\zs
do wyboru pozycji początkowej wzoru, tak aby kursor zatrzymał się na liczbie po wyszukiwaniu.Pamiętaj, że potrzebujesz najnowszej wersji Vima, aby to działało.
źródło
g<C-a>
ten @fruglemonkey, o którym mówiłeś, ale dziękuję za odpowiedź. Powinienem zauważyć, że podczas próby makra - tuż przed przejściem do tejg<C-a>
części, nie jest to ostatnia litera „1”, którą chcę zwiększyć, która jest podświetlana blokowo, ale zamiast tego jest to litera przed pierwszą „1” "znak, który zostanie podświetlony blokowo. (Także myślę, że będzie to miało byćyy11p
i10j
w makro, ponieważ Czekam na dodać 11 linii - w sumie 12.)\zs
, ale równie dobrze mogłem po prostu dodaćl
po<CR>
.vim -u NONE
. Właśnie to zrobiłem i działa to doskonale! W rzeczywistości nie ma możliwości, aby wyszukiwanie pasowało do pierwszego 1, ponieważ wymaga poprzedzającego go ukośnika.