2

私は数字でこのテキストを持っています:

My numbers are 04, and 0005
My numbers are 05, and 0006
My numbers are 06, and 0035
My numbers are 07, and 0007
My numbers are 08, and 0009

これは、選択/ブロック選択/列の数値をインクリメントまたはデクリメントするために常に使用したコードです。上記のテキストの最後の4つの数値を8でインクリメントします。

 '<,'>s/\%V\<\d\{4}\>/\=submatch(0)+8/g

しかし、私は今日、それが奇妙なことをすることに気づきました。これは出力です:

My numbers are 04, and 13
My numbers are 05, and 14
My numbers are 06, and 37 <---
My numbers are 07, and 15
My numbers are 08, and 17
  • 先行ゼロを削除します(先行ゼロがある場合はそれらを保持し、先行ゼロがない場合は追加しません)
  • 2を追加した37を除くすべての数値に8を追加しました。(なぜですか?)

先行ゼロを失うことなく、選択(またはブロック選択)から数値を加算/減算する正規表現を見つけるのを誰かが助けてくれますか?

注:
コントロールA +コントロールxは先行ゼロを保持し、希望どおりに機能することに注意しましたが、次のようになり
ました。-代替コマンド('<、'> s /)では使用できないことを確認しました
-そしてI番号のリストにpe200を追加する方法がわからない(200 x?)

4

3 に答える 3

4

leading zero makes number 8-based.

(0035)8 == (29)10

You can test in vim:

:echo 0035 == 29

It'll print 1(true).


Try this:

:%s/\(\<[0-9]\{4}\>\)\@=0*\([0-9]*\)/\=submatch(2)+8/
于 2012-04-17T16:36:38.590 に答える
2

これ?

:%s/\v[0-9]{4}/\=printf("%04d", substitute(submatch(0), '^0\+', '', 0)+8)/   

編集

@Remonn、あなたはあなたの質問に正しいサンプル入力を与えるべきです。上記の行はあなたの例で機能します。

新しい要件については、以下の行をご覧ください。

入力:

40
20
120
0500
230
0000000020
00000000000005000

vim cmd:

:%!awk '{if($0~/^0/){f="\%"length($0)"d";$0+=8; s=sprintf(f,$0); gsub(/ /,"0",s);}else s=$0+8;print s}'

ファイルを次のように変更します。

48
28
128
0508
238
0000000028
00000000000005008

私のcmdでは、「%」を使用しました。(v)トリックを実行する番号を選択してから、私のcmdで試してください。

幸運を

于 2012-04-17T16:52:02.710 に答える
0

デフォルトでは、Vimは08進数で始まる数値を扱います。

このため、.vimrcにこれがあります。

set   nrformats-=octal  " Don't bother with octal, I never use it
于 2012-04-18T04:59:27.337 に答える