Belirli satırlarda vim'de arayın ve değiştirin


95

kullanabilirim

:5,12s/foo/bar/g

5. ve 12. satırlar arasında aramak foove değiştirmek için bunu barnasıl sadece 5. ve 12. satırlarda yapabilirim (aradaki satırlarda değil)?

Yanıtlar:


76

Vim'in belirli satırlarda, sütunlarda vb. Eşleşen özel düzenli ifade atomları vardır; eşleşmeleri sınırlamak için bunları (muhtemelen aralığa ek olarak) kullanabilirsiniz:

:5,12s/\(\%5l\|\%12l\)foo/bar/g

Görmek :help /\%l


8
Beklediğimden daha karmaşık bir yol ama sorumu mükemmel bir şekilde yanıtlıyor. Teşekkürler!
pfnuesel

56

Değişikliği 5. satırda yapabilir ve 12. satırda minimum çabayla tekrarlayabilirsiniz:

:5s/foo/bar
:12&

Ingo'nun işaret ettiği gibi :&, bayraklarınızı unutur. Kullandığınız /giçin doğru komut şu olacaktır :&&:

:5s/foo/bar/g
:12&&

Gör :help :&ve arkadaşlar.


10
Belirsizliği :&kullanmak için +1 . Bayraklar ( s/../../g) varsa, birinin kullanılması gerekir :&&...
Ingo Karkat

10
@IngoKarkat, adil olmak gerekirse, bence \(\%5l\|\%12l\)daha belirsiz:&
doubleDown

13

cSonuna her zaman bir ekleyebilirsiniz . Bu, her maç için onay isteyecektir.

:5,12s/foo/bar/gc

1
5. ve 12. satırlar arasında çok sayıda eşleşme varsa bu bir kabus olabilir ( goyunda bir bayrak olduğunu unutmayın )
doubleDown

1
@doubleDown Bunun evrensel bir çözüm olması amaçlanmamıştır (birçok olası adayın olduğu yerlerde), ancak çoğu durumda gerçekten n5 veya 6 kez basmak \(\%5l\|\%12l\), yedek ifadeye eklemekten daha zahmetli mi?
Dean

Bunu yararlı buluyorum, her satırı değiştirmek istedim, bu yaptığımdan daha hızlı olurdu.
tiktak

9

İlginç soru. Görünüşe göre yalnızca aralık seçimi var ve birden çok satır seçimi yok:

http://vim.wikia.com/wiki/Ranges

Ancak, 5. ve 12. satırlarda özel bir şeyiniz varsa, :goperatörü kullanabilirsiniz . Dosyanız böyle görünüyorsa (yalnızca referans için sayılar):

 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

Ve Değiştirmek istediğiniz onetarafından enovar hatlarda enilyerine line:

:g/enil/s/one/eno/

5
bu aslında çok şey
doubleDown

1

Kullanabilirsiniz ed- vi ve vim'e benzer komutlara sahip satır yönelimli bir metin düzenleyici. Muhtemelen vi ve vim'den öncedir.

Bir komut dosyasında (EndCommand işaretçisine kadar girdiyi işleyen burada bir belge kullanarak) şöyle görünür:

ed file <<EndCommands
    5
    s/foo/bar/g
    7
    s/foo/bar/g
    wq
EndCommands

Açıkçası, ed komutları komut satırında da kullanılabilir.


3
vimAlternatife göre bir avantaj görmüyorum .
Bernhard

1
Aynısı Vim için de yapılabilir; sayılar aslında 'nin önüne konabilir :s, ancak yine de :skomutun kopyası vardır (romainl'in çözümü bundan kaçınır).
Ingo Karkat

Benim görüşüm, kullanıcının düzenleme için ikiden fazla satır seçmek isteyebileceğiydi. Bu durumda etkileşimli olmayan bir yaklaşım ilgi çekici olabilirdi - ki bu AFAIK vim ile yapılamaz.
suspectus

1
Oh, Vim bunu yapabilir (örn. "Ex" modunda), ama haklısınız, etkileşimli bir düzenleyiciye göre başka bir aracın tercih edilmesi gerektiği konusunda haklısınız. Tercihim sedolsa da ...
Ingo Karkat
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.