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)?
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ć c
na końcu. Spowoduje to potwierdzenie każdego dopasowania.
:5,12s/foo/bar/gc
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):
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ć one
przez eno
na liniach gdzie tam enil
zamiast 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ń.
vim
alternatywą.
:s
, ale nadal istnieje powielenie :s
polecenia (czego unika rozwiązanie Romainla).
sed
, chociaż ...