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"
až
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