Vim Regex Yakalama Grupları [bau -> byau: ceu -> cyeu]


132

Bir kelime listem var:

bau
ceu
diu
fou
gau

Bu listeyi şuna dönüştürmek istiyorum:

byau
cyeu
dyiu
fyou
gyau

Başarısız bir şekilde komutu denedim:

:%s/(\w)(\w\w)/\1y\2/g

Bunun işe yaramadığını düşünürsek, normal ifade yakalama gruplarının Vim'de çalışması için neyi değiştirmem gerekiyor?



4
Biraz konu dışı, bu yüzden buraya bir yorum olarak koyuyorum ama… yapardım :%norm ay<CR>.
romainl

2
(Tam olarak tarif gibiyse) sizin durumda, bir seçenek: ile 2 sütuna hareket lile Görsel Blok moduna girmek Ctrl+v, ile tüm sütun işaretlemek Shift+gardından ldaha sonra ekleme moduna girmek, Shift+ive girdi 'y'. EscEkleme modundan çıkmak için son işlem dahil 7 tuş vuruşu . Cevap olarak göndermiyorum çünkü mesele yakalama grupları değil (bunu bulduğumda aradığım şey buydu). :-)
LAFK diyor Reinstate Monica

Yanıtlar:


224

Bunu düzeltmek için bir yolu tarafından çevrelenen deseni sağlanması gereğidir kaçan Parantez:

:%s/\(\w\)\(\w\w\)/\1y\2/g

Biraz daha kısa (ve daha büyü -al) kullanmaktır \vdesende tüm ASCII karakterleri hariç ondan sonra, yani '0'-'9', 'a'-'z', 'A'-'Z've '_'özel bir anlamı vardır:

:%s/\v(\w)(\w\w)/\1y\2/g

Görmek:


41

Ters eğik çizgilerle yakalama gruplarından kaçmak istemiyorsanız (kaçırdığınız şey budur), \vVim'in normal ifade motorunu çok sihirli moda çevirin :

:%s/\v(\w)(\w\w)/\1y\2/g

Ingo, soruyu yanlış yere koyduğum için özür dilerim :exmode. gvim bul / değiştir diyalog kutusunda bunu yapmanın bir yolu var mı?
JJoao

3
@JJoao: Hayır, bul / değiştir kutusu yalnızca değişmez arama ve değiştirme içindir. Bunu zaten kullanmamalısın; sadece Not Defteri kullanıcıları için eğitim tekerlekleri.
Ingo Karkat

Ingo, teşekkür ederim (benim için değil: exmode'dan memnunum, ancak bir sözlük projesindeki dilbilimciler için): neredeyse işe yarıyor - \v...regexp çalışma bul; yeni dizede &çalışıyor, ancak \ korunuyor ( \1\rkayboluyor)
JJoao

@JJoao: Evet, onunla oynarken ben de bunu öğrendim. Ex modu olmadan Vim kullanmanın iyi bir fikir olup olmadığı konusunda hala şüpheliyim, ancak kendi ara ve değiştir diyaloğunuzu (dahili olarak güçlendirilmiş :s) inputdialog()ve biraz Vimscript aracılığıyla kolayca oluşturabilirsiniz.
Ingo Karkat

Ingo: Tekrar teşekkürler; Şüpheci fikrinize katılıyorum. Inputdialg +: s + vimscript muhtemelen gvim'in find replace'in oluşturulma şeklidir. Benim için \1 \r tedavi bir gvim hatasıdır. Onu belirli bir listeye göndermeye çalışacağım. Bu arada ben tek vimscript-inputdialog'umu deneyeceğim.
JJoao

34

Daha kısa olan bu kalıbı da kullanabilirsiniz:

:%s/^./&y
  • %s kalıbı tüm dosyaya uygular.
  • ^. satırın ilk karakteriyle eşleşir.
  • &yydesenin arkasına ekler .

13

Ayrıca Gruplandırma parantezinden de kaçmanız gerekir:

:%s/\(\w\)\(\w\w\)/\1y\2/g

İşin püf noktası bu.

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.