VIM kullanarak değiştirin, arama düzeninin bir kısmını yeniden kullanın


29

VImArama dizgimin bir parçası olan normal ifadeyi yeniden kullanabileceğim bazı değişiklikler yapmak için bir arama ve değiştirme komutu ile çalışıyorum ve çalışıyorum.

Basit bir örnek, değiştirmek (10)istediğim {10}, 10'un herhangi bir sayı olabileceği bir satır olabilir.

Bu kadar uzağa geldim

  .s/([0-9]*)/what here??/

tam olarak istediğim kısımla eşleşiyor.

Şimdi değiştirme denedim

  .s/([0-9]*)/{\0}/

Ancak, bu çıktı olarak verir {(10)}

Sonra denedim

 .s/(\zs[0-9]*\ze)/{\0}/

Ancak, bu da bana verdi ({10}), ki ben de kapattım, ama istediğimi değil.

Bunun yerine başka bir işaretleme / geri referanslamaya ihtiyacım olduğunu düşünüyorum \0, ancak nereye bakacağımı bilmiyorum. Öyleyse soru şu, bu vim içinde yapılabilir mi, eğer öyleyse, nasıl?

Yanıtlar:


37

\0bütün eşleşme. Bunun sadece bir kısmını kullanmak için, bu şekilde ayarlamanız ve \ 1 kullanmanız gerekir.

.s/(\([0-9]*\))/{\1}/

Daha ayrıntılı bir talimatı burada veya vim yardımında bulabilirsiniz .


Yakalama için parantez içinde ters eğik çizgi kaçtığını unutmayın.
Randall

0

Geçenlerde bazı eski kodları devraldım ve şu gibi tüm oluşumları değiştirmek istedim:

print "xx"
print x,y
print 'xx'

için

logging.info("xy") 

veya

logging.info(x,y)

Önceki cevaba dayanarak ve birisinin bundan faydalanacağını ümit ederek, aşağıdaki komutu kullandım, tüm olayları değiştirecek:

%s/print\( .*\)/logging.info\(\1\)/g

Eğer yerine ise %birlikte .ve kaldırmak /gsen ile sona erecek

.s/print\( .*\)/logging.info\(\1\)

Bu, her bir eşleşmeyi geçmeni ve değiştirip değiştirmeyeceğini seçmeni sağlayacak.


0

Her bir eşleşmeyi geçmenin daha iyi bir yolu, satır sonuna gitmek yerine kodun sonuna "c" eklemektir.

%s/print\( .*\)/logging.info\(\1\)/gc

Bu gerçekten asıl soruya hiçbir şekilde cevap vermiyor
Bernhard
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.