2009-05-18 15 views
10

Biorąc pod uwagę następujący tekst w vim:Wyszukiwanie Vim i zastępowanie przez zmniejszanie back-reference?

[2] [3] [4] 

Chcę przeprowadzić wyszukiwanie i zastąpić i wytwarzają następujące:

[1] [2] [3] 

wiem, jak wydobyć się z liczby osób korzystających z powrotem odniesienie wyszukiwarce i zamień:

:%s/\[\(\d\)\]/[\1]/g 

Ale teraz pytanie brzmi: jak obniżyć wartość \ 1.

Wszelkie pomysły?

Odpowiedz

16

Spróbuj

:%s/\[\(\d\+\)\]/\=join(['[', submatch(1) - 1, ']'], '')/g 

EDIT: dodałem \+ po \d w razie gdybyś chciał dopasować więcej niż pojedynczych liczb dwucyfrowych.

Zobacz :help sub-replace-special

+0

Awesome! Czy znasz jakieś dobre dokumenty dotyczące używania \ = w wyszukiwaniu i zamianie? –

+0

Spróbuj: pomóż zastąpić wyrażenie – sykora

0

Spróbuj tego:

%s:\d:\r&\r:g 

Then

s/\d/\=submatch(0)-1/ 

A teraz trzeba połączyć przewody.

2

Podczas korzystania \zs i \ze zakotwiczyć numer w nawiasie bez ich dopasowanie, podstawienie staje się prostsze, ponieważ nie trzeba złączyć w wymianie:

:%s/\[\zs\d\+\ze]/\=submatch(0)-1/g 
Powiązane problemy