Zastąp za pomocą VIM, ponownie użyj części wzorca wyszukiwania

Pracuję z VIm i próbuję skonfigurować polecenie wyszukiwania i zamiany, aby wykonać kilka zamian, w których mogę ponownie użyć wyrażenia regularnego będącego częścią mojego ciągu wyszukiwania.

Prostym przykładem może być wiersz, w którym chcę zamienić (10) do {10}, gdzie 10 może być dowolną liczbą.

Dotarłem tak daleko

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

który dokładnie pasuje do części, którą chcę.

Teraz próbowałem zastąpić

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

Ale, to daje jako wynik {(10)}

Następnie spróbowałem

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

Jednak to dało ja ({10}), które również zamykam, ale nie to, czego chcę.

Myślę, że potrzebuję innego rodzaju oznaczania / odwoływania się zamiast tego \0, ale nie wiem, gdzie szukać. Pytanie brzmi, czy można to zrobić w vimie, Jeśli tak, to w jaki sposób?

Odpowiedź

\0 to całe dopasowanie. Aby użyć tylko części, musisz ustawić to w ten sposób i użyć \ 1

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

Bardziej szczegółowe instrukcje można znaleźć w tutaj lub w pomocy vima.

Komentarze

  • Zauważ, że nawiasy do przechwytywania są poprzedzone odwrotnym ukośnikiem.

Odpowiedź

Niedawno odziedziczyłem stary kod i chciałem zastąpić wszystkie wystąpienia, takie jak:

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

do

logging.info("xy") 

lub

logging.info(x,y) 

Opierając się na poprzedniej odpowiedzi i mając nadzieję, że ktoś na tym skorzysta. następujące polecenie, które zmieni wszystkie wystąpienia:

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

Jeśli zmienisz % na . i usuń /g otrzymasz

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

, który umożliwi Ci przejść każde dopasowanie i zdecyduj, czy chcesz je zmienić, czy nie.

Odpowiedź

Lepszym sposobem na przejrzenie każdego dopasowania jest dodaj „c” na końcu kodu zamiast przechodzić wiersz po wierszu

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

Komentarze

  • To naprawdę nie ' nie odpowiada na pierwotne pytanie w żaden sposób

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *