Nahraďte pomocí VIM, znovu použijte část vyhledávacího vzoru

Pracuji s VIm a pokouším se nastavit příkaz search and replace k provedení některých náhrad, kde mohu znovu použít regulární výraz, který je součástí mého vyhledávacího řetězce.

Jednoduchým příkladem by byl řádek, kde chci nahradit (10) do {10}, kde 10 může být libovolné číslo.

Došel jsem tak daleko

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

který přesně odpovídá části, kterou chci.

Nyní jsem se pokusil nahradit

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

Ale, to dává jako výstup {(10)}

Potom jsem zkusil

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

To však dalo me ({10}), které také zavírám, ale ne to, co chci.

Myslím, že místo tohoto \0, ale nevím, kde hledat. Otázkou tedy je, zda to lze provést vim, nd pokud ano, jak?

odpověď

\0 je celá shoda. Chcete-li použít pouze jeho část, musíte to nastavit takto a použít \ 1

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

Podrobnější pokyny najdete zde nebo v nápovědě vim.

Komentáře

  • Všimněte si, že závorky pro zachycení jsou uvozeny zpětným lomítkem.

Odpověď

Nedávno jsem zdědil nějaký starší kód a chtěl jsem nahradit všechny výskyty jako:

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

logging.info("xy") 

nebo

logging.info(x,y) 

V návaznosti na předchozí odpověď a v naději, že z toho někdo bude mít prospěch, jsem použil následující příkaz, který změní všechny výskyty:

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

Pokud místo % použijete . a odstranění /g skončíte s

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

, které vám umožní přejít každou shodu a zvolte, zda ji změníte nebo ne.

Odpovědět

Lepší způsob, jak vám umožnit projít každou shodu, je přidejte „c“ na konec kódu, místo toho, abyste postupovali řádek po řádku

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

Komentáře

  • Toto opravdu nijak neodpovídá ' na původní otázku

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *