2009-05-18 7 views
10

はVimの中に次のテキストを考える:Vim検索と逆参照を減らすことによって置き換えますか?

[2] [3] [4] 

私が検索を実行し、交換すると、次を生成します:

[1] [2] [3] 

私は、検索を経由して後方参照を使用して数字を抽出する方法を知っていると

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

しかし、今の質問は、あなたが、\ 1の値をデクリメント行くのですかです:交換してください。

どのようなアイデアですか?

答えて

16

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

EDITしてみてください:私はあなたが1桁の数よりも多くを一致させるために望んでいた場合には\d\+を追加しました。

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

その後

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

そして今、あなたがラインに参加する必要があります。

:help sub-replace-special

+0

すごいです! \ =を使用して検索や置換を行う際の優れた文書を知っていますか? –

+0

試してください:help sub-replace-expression – sykora

0

はこれを試してみてください参照してください。

2

あなたがそれらをマッチングすることなく、括弧内の数を固定する\zs\zeを使用するときは、交換に連結する必要がないので、置換は、単純になる:

:%s/\[\zs\d\+\ze]/\=submatch(0)-1/g 
関連する問題