Zamień za pomocą VIM, ponownie wykorzystaj część wzorca wyszukiwania

29

Pracuję VImi próbuję skonfigurować polecenie wyszukiwania i zamiany, aby wykonać pewne zamiany, w których mogę ponownie użyć wyrażenia regularnego, które jest częścią mojego ciągu wyszukiwania.

Przykładem byłaby prosta linia, gdzie chcę, aby wymienić (10)się {10}, gdzie 10 może być dowolną liczbą.

Zaszedłem tak daleko

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

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

Teraz wymiana, próbowałem

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

Ale daje to jako wynik {(10)}

Potem spróbowałem

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

To mi jednak dało ({10}), co też zamykam, ale nie to, czego chcę.

Myślę, że zamiast tego potrzebuję innego rodzaju oznaczania / odsyłaczy \0, ale nie wiem, gdzie szukać. Pytanie brzmi: czy można tego dokonać w vimie, a jeśli tak, to w jaki sposób?

Bernhard
źródło

Odpowiedzi:

37

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

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

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

pośpiech
źródło
Zauważ, że nawiasy dla przechwytywania są poprzedzane odwrotnym ukośnikiem.
Randall
0

Niedawno odziedziczyłem trochę starszego kodu 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ś skorzysta z niej, użyłem następującego polecenia, które zmieni wszystkie wystąpienia:

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

Jeśli zastąpi %się .i usunąć /gskończy się z

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

pozwoli ci to przejrzeć każdy mecz i wybrać, czy chcesz go zmienić, czy nie.

yagad
źródło
0

Lepszym sposobem na przejrzenie każdego dopasowania jest dodanie litery „c” na końcu kodu, zamiast przechodzenia między wierszami

%s/print\( .*\)/logging.info\(\1\)/gc
Tim Rosenow
źródło
To naprawdę nie odpowiada w żaden sposób na pierwotne pytanie
Bernhard