W vim czasami mam okazję zastąpić kilka pierwszych wystąpień dopasowania na linii, ale nie każdy g
chciałby. na przykład:
a a a a a
do
b b b a a
Wiem, że mógłbym użyć :s/a/b/[enter]:[up][enter]:[up][enter]
, ale to dość nużące przy trzech powtórzeniach, mam linie z potencjalnie 10+ podstawieniami.
Próbowałem:
:s/a/b/3g
: vim narzekał na końcowe znaki.:s/a/b/3
: zmienia pierwsze wystąpienie w tym i kolejnych dwóch wierszach.3:s/a/b
: tak samo jak poprzednio.:s/a/b/g3
: zmienia wszystkie wystąpienia tego i następnych dwóch wierszy.:3s/a/b
: zmienia pierwsze wystąpienie w linii 3.:/a/,3/a/s/a/b
: zmienia pierwsze wystąpienie w każdej linii między kolejnąa
a trzecią linią zawartąa
w pliku (w razie potrzeby monit o cofnięcie).:/a/,/\([^a]*a\)\{3\}/s/a/b/
: zmienia pierwsze wystąpienie w każdym wierszu między tym a następnym z 3a
s (i nie byłoby to łatwe do rozszerzenia na wyszukiwanie wielu znaków).
I różne inne wzorce adresowania, z których żaden nie działał. Muszę powiedzieć, że sporo się dowiedziałem o :s
poleceniu, które próbuje znaleźć odpowiedź na ten problem, ale nadal go nie rozwiązałem.
Czy ktoś wie jak to zrobić?
(punkty bonusowe za określony zasięg, np. od drugiego do czwartego wystąpienia)
n
i .
chociaż nie pomyślałem, aby ich tutaj użyć. Z pewnością poprawa, dzięki.
s/a/=something/
powinien wykonać trick ( :help sub-replace-=
). Nie jestem wystarczająco biegły w Vimie, żeby pisać something
od razu.
:[up][enter]
można go zastąpić &
, co wciąż nie jest idealne, ale przynajmniej jest mniej bolesne.