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