Yapabilir miyim: Sadece hattın son maçında çalışabilir miyim?


16

:s/pattern/replacementilk maçta ve :s/pattern/replacement/gtüm maçlarda oynanır .

Sadece sonuncusunda nasıl çalışır?

Yanıtlar:


18

Kullanmak istiyorum \zs

:%s/.*\zspattern/replacement/

Biraz açıklama:

  • . herhangi bir tek karakteri temsil eder
  • * açgözlü eşleşmeyi temsil eder (mümkün olduğunca çok sayıda)

Vim'de, sıfır genişlikli bağlantı noktalarını kullanabilir \zsve \zeeşleştirmek istediğiniz aranan desenin başlangıcını ve sonunu tanımlayabilirsiniz. Deseninizdeki öncesi \zsve sonrası değiştirme işleminden \zeetkilenmeyecektir.

Kolay anlaşılması hale getirmek için, ben bu örneği kullanmak istiyorum Wikia 'ın Arama ve değiştirme :

Bir desenin başlangıcını ve sonunu ayarlamak için \zsve tuşlarını kullanarak yazmayı kaydedin \ze. Örneğin:

:s/Copyright 2007 All Rights Reserved/Copyright 2008 All Rights Reserved/ 

kullanın:

:s/Copyright \zs2007\ze All Rights Reserved/2008/

Daha fazla bilgi için,


Lütfen \zscevabınızda neler olduğuna dair temel bir açıklama verebilir misiniz?
EvergreenTree

3
Belirterek It değerinde nedeni çünkü bu işler olduğunu .*olduğunu açgözlü .
Joker

7

\(.*\)Öğesinin tümünü , ancak son tekrarını gruplandırarak son eşleşmeyi arayabilirsiniz pattern. Sonra yakalanan grupla \1çıkın ve replacement.

:%s/\(.*\)pattern/\1replacement/

(Bu @ ryuichiro en aşağı olan \zssenin ki, çözümü \1yaklaşımı daha ayrıntılı işlevsel olarak eşdeğer, ancak (Öte yandan, bunların diğer regex tatlar için kullanılır, özellikle bazıları için hatırlamak daha kolay olabilir)..)
Aaron Thoma

0

Bütünlük uğruna bir alternatif yayınlayacağımı düşündüm. Vim, bazıları daha standart düzenli ifade bakış açısı iddialarına (negatif / pozitif ileri / geri bakış) benzeyen çoklu öğelere sahiptir . /programming/2973436/regex-lookahead-lookbehind-and-atomic-groups

Bu durumda negatif bir ileriye bakmak istiyoruz \@!, yani öğeden önce gelen atomun kalıptan sonra gerçekleşmediğini iddia etmek istiyoruz . Bu durumda atom, kendisinden önce gelen başka bir şey olan desenin kendisidir:

:%s/pattern\(.*pattern\)\@!/replacement/

Parantez içindeki parça sıfır genişliktedir ve eşleşmeye dahil edilmemiştir, bu nedenle oyuncu değişikliği ile değiştirilmez.

:h \@!daha fazla bilgi için veya :h pattern-multi-itemsdiğer arama varyasyonlarını içeren bölümün tamamı için.

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.