Vim

2011-11-01 20 views
7

ile etiketlerin arasındaki tüm karakter örneklerini değiştirin: < dosya adı> ... </filename> etiketleri ile tüm/karakterlerin yerine geçmem gerekiyor.Vim

Dosya bu etiketlerin 2.000'ine benzer ve yalnızca bu etiketlerin içindeki/karakterleri değiştirmem gerekiyor.

Nasıl yapabilirim?

+0

@ewok gerçekleştirmek -ilgili sorular? – deviousdodo

+0

@ewok: vim sorularının (bu gibi normal ifadeler) "SSS'de yaygın olarak kullanılan" yazılım araçları "nda açıkça görüldüğü oldukça iyi anlaşılmıştır. – jkerian

cevap

9

Düzenleme: Yeni bilgiler göz önüne alındığında, aşağıda yer değiştirme muhtemelen çalışacaktır:

:%s/<filename>\zs.\{-}\ze<\/filename>/\=substitute(submatch(0), '\/', '\', 'g')/ 

Açıklama:

  • %s:
  • /<filename> tüm dosya genelinde ikame: Başlangıç ​​desen ve statik Karşılık gelen metin
  • \zs: eşleştirilen metnin başlangıcı
  • .\{-}: Herhangi bir karakter, sigara açgözlü
  • \ze: eşleşti metin
  • <\/filename>/ sonu: hedeflenen etiket ve desen
  • \= sonu:
  • substitute(submatch(0), '\/', '\', 'g')/ bir vim ifadesi olarak değiştirilmesini değerlendirmek: Tüm / yerine Eşleşen metinde \ ile.

Orjinal cevap:

Burada XML tarzı etiketi anlamına varsaymak gidiyorum. Yapmam gereken şey, üzerinde çalışmak istediğiniz alanı görsel olarak seçmektir, daha sonra yalnızca bu seçim üzerinde çalışmak için \%V regex atomunu kullanın.

vit:s!\%V/!\\!g 

Numara yapmalısınız.

:'<,'>s!\%V/!\\!g 
+0

Sayısında" konuyla ilgili "olarak listelenmiştir, ancak bu yalnızca çalışır seçili etiket, tüm etiketlerde değil, değil mi? – Oletros

+0

Doğru. Bu, sorunuzda biraz daha belirgin olmak isteyebileceğiniz bir ayrıntıdır. –

+0

Teşekkürler, bu bir çekicilik gibi çalıştı :) – Oletros

0

VIM keskin bir öğrenme eğrisi vardır regex en yaptığımız gibi,: gibi : basıldığında, vim otomatik görsel seçimi için bir dizi katacak unutmayın, gerçek ikame komut bakacağız. Bu komutun yapacağına inanıyorum. Her char'dan '\' ile kaçmalısınız.

:%s/\//\\/g 
+0

Teşekkürler, ama bu daha/değiştirmem gerekecek, sadece/içeride değiştirmem gerekiyor < filename > ... Oletros

+0

Oh, benim kötü, sen sadece etiketlerdeki yolları değiştirmek istiyorum. Kafamın üst kısmındaki regex'i bilmiyorum; Bu eğiticiyi kontrol etmeyi deneyin: http://www.thatsquality.com/articles/how-to-match-and-replace-content-between-two-html-tags-using-regular-expressions – Noah

+0

Teşekkürler, ben bakacağım o – Oletros

2

Iff biz etiketleri tek satırlarda varsayabiliriz, bu basitçe:

Not girin^M pencerelerde CvCm (CqCmolarak)

:g/<filename>/norm! /filename>/e^Mvit:s#\%V/#\\#g^M 

Her iki test: bir model içinde \% V kullanılarak Randy ile ipucu entegre

Hmmmm daha basit hale getirir. Hoo. Şimdi anlatacağım. Tut.

  1. :g/<filename>/ - _for <filename>
  2. norm! içeren her satır - _execute Normal komutları (göz ardı eşleştirmeleri)
  3. /filename/eaçık etiketin ucunaatlama girin
  4. vit - inci iç metnini seçin Görsel modunda etiketine
  5. :s#\%V/#\\#g girin - bu görsel seçimi _on, editör diğer yüzlerce farklı biri yapar ne ikame (yerine / tarafından \)