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.