mogę użyć
:5,12s/foo/bar/g
aby wyszukać fooi zamienić go barmiędzy wierszami 5 i 12. Jak mogę to zrobić tylko w wierszach 5 i 12 (a nie w wierszach pomiędzy)?
Odpowiedzi:
Vim ma specjalne atomy wyrażeń regularnych, które pasują do pewnych linii, kolumn itp .; możesz ich użyć (ewentualnie oprócz zakresu), aby ograniczyć dopasowania:
:5,12s/\(\%5l\|\%12l\)foo/bar/g
Widzieć :help /\%l
Możesz dokonać zamiany w linii 5 i powtórzyć ją przy minimalnym wysiłku w linii 12:
:5s/foo/bar
:12&
Jak zauważył Ingo, :&zapomina o twoich flagach. Ponieważ używasz /g, poprawnym poleceniem byłoby :&&:
:5s/foo/bar/g
:12&&
Zobacz :help :&i przyjaciele.
:&użycie tego, co niejasne . Jeśli są flagi ( s/../../g), to trzeba ich użyć :&&...
\(\%5l\|\%12l\)jest bardziej niejasny niż:&
Zawsze możesz dodać cna końcu. Spowoduje to potwierdzenie każdego dopasowania.
:5,12s/foo/bar/gc
gflaga)
n5 lub 6 razy jest bardziej uciążliwe niż dodanie \(\%5l\|\%12l\)do instrukcji zastępczej?
Interesujące pytanie. Wygląda na to, że istnieje tylko wybór zakresu, a nie wybór wielu wierszy:
http://vim.wikia.com/wiki/Ranges
Jeśli jednak masz coś specjalnego w liniach 5 i 12, możesz użyć :goperatora. Jeśli twój plik wygląda tak (numery tylko w celach informacyjnych):
1 line one
2 line one
3 line one
4 line one
5 enil one
6 line one
7 line one
8 line one
9 line one
10 line one
11 line one
12 enil one
I chcesz zastąpić oneprzez enona liniach gdzie tam enilzamiast line:
:g/enil/s/one/eno/
Możesz użyć ed- liniowego edytora tekstu z podobnymi poleceniami do vi i vim. Prawdopodobnie poprzedza vi i vim.
W skrypcie (używającym dokumentu tutaj, który przetwarza dane wejściowe do znacznika EndCommand) wyglądałoby to następująco:
ed file <<EndCommands
5
s/foo/bar/g
7
s/foo/bar/g
wq
EndCommands
Oczywiście poleceń ed można również używać w wierszu poleceń.
vimalternatywą.
:s, ale nadal istnieje powielenie :spolecenia (czego unika rozwiązanie Romainla).
sed, chociaż ...