2011-11-01 11 views
7

Muszę zastąpić wszystkie wystąpienia znaku/znakiem \ pomiędzy < nazwa pliku> ... </filename> tags.Zastąp wszystkie wystąpienia znaku między znacznikami za pomocą vim

Plik ma około 2000 z tych tagów i muszę tylko zamienić znak/wewnątrz tych tagów.

Jak mogę to zrobić?

+0

@ewok Co sprawia, że ​​ten jeden inny od pozostałych setek edytorze -Powiązane pytania? – deviousdodo

+0

@wok: całkiem dobrze ustalono, że pytania vim (w szczególności takie pytania do wyrażeń regularnych) należą do kategorii "narzędzia powszechnie używane przez programistów" wyraźnie wymienione jako "na temat" w podziękowaniach – jkerian

Odpowiedz

9

Edit: Ze względu na nowe informacje, poniższy zastąpienie prawdopodobnie działa:

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

wyjaśnieniu:

  • %s: substytut całej pliku
  • /<filename>: początek wzorca i statyczne tekst do porównania z
  • \zs: początek dopasowanego tekstu
  • .\{-}: dowolny charakter, nie chciwy
  • \ze: koniec dopasowanego tekstu
  • <\/filename>/: koniec ukierunkowany znacznikiem i wzór
  • \=: ocena zastępstwo jako vim ekspresji
  • substitute(submatch(0), '\/', '\', 'g')/: wymień wszystkie / z \ w dopasowanym tekście.

Oryginalny odpowiedź:

mam zamiar założyć, to znaczy znaczniki XML stylu tutaj. Chciałbym wizualnie wybrać obszar, na którym chciałbym operować, a następnie użyć atomu regex \%V, aby działał tylko na tym wyborze.

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

Powinien załatwić sprawę. Zauważ, że po naciśnięciu :, vim automatycznie dodać zakres do selekcji wizualnej, rzeczywista komenda podstawienie będzie wyglądać następująco:

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

Dzięki, ale to działa tylko na faktyczny tag wybrany, a nie we wszystkich tagach, to zrobić? – Oletros

+0

Prawidłowo. To jest szczegół, który może być bardziej oczywisty w twoim pytaniu. –

+0

Dzięki, zadziałało jak urok :) – Oletros

0

VIM ma ostry krzywej uczenia się, jak zrobić regex jest. Wierzę, że to polecenie to zrobi. Musisz uciec z każdego znaku "\".

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

Dzięki, ale to zastąpi więcej/niż muszę wymienić, muszę tylko wymienić/wewnątrz < filename > ... Oletros

+0

Och, moje złe, po prostu chcesz zmienić ścieżki w tagach. Nie znam regexu z mojej głowy; spróbuj sprawdzić ten samouczek: http://www.thatsquality.com/articles/how-to-match-and-replace-content-between-two-html-tags-using-regular-expressions – Noah

+0

Dzięki, popatrzę na to – Oletros

2

Iff możemy założyć, że tagi są na pojedynczych linii, jest to po prostu:

Uwaga Wprowadź ^M jak CvCm (CqCm na oknach)

:g/<filename>/norm! /filename>/e^Mvity:let @"=substitute(@", '/', '\\', "g")^Mgvp 

Hmmm integracji wskazówkę Randy na wykorzystaniu \% V w strukturze sprawia, że ​​prościej:

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

Testowałem oba. Whoo. Wyjaśnię teraz. Czekaj.

  1. :g/<filename>/ - _for każda linia zawiera <filename>
  2. norm! - _execute normalnych poleceń (pomijając odwzorowania)
  3. /filename/eWejścieskok do końca otwartego znacznika
  4. vit - wybierz wewnętrzny tekst th w tagu w trybie wizualnym
  5. :s#\%V/#\\#gWprowadź - _on tej selekcji wizualnej, wykonaj podstawienie (zastąpi \ przez /)
Powiązane problemy