mogę użyć
:5,12s/foo/bar/g
aby wyszukać foo
i zamienić go bar
między wierszami 5 i 12. Jak mogę to zrobić tylko w wierszach 5 i 12 (a nie w wierszach pomiędzy)?
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:
Jak zauważył Ingo,
:&
zapomina o twoich flagach. Ponieważ używasz/g
, poprawnym poleceniem byłoby:&&
:Zobacz
:help :&
i przyjaciele.źródło
:&
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ć
c
na końcu. Spowoduje to potwierdzenie każdego dopasowania.źródło
g
flaga)n
5 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ć
:g
operatora. Jeśli twój plik wygląda tak (numery tylko w celach informacyjnych):I chcesz zastąpić
one
przezeno
na liniach gdzie tamenil
zamiastline
:źródło
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:
Oczywiście poleceń ed można również używać w wierszu poleceń.
źródło
vim
alternatywą.:s
, ale nadal istnieje powielenie:s
polecenia (czego unika rozwiązanie Romainla).sed
, chociaż ...