17

私はこれがロングショットであることを知っていますが、私は巨大なテキストファイルを持っており、特定の数値をいくつかの基準に一致する他の数値に追加する必要があります.

例えば。

identifying text 1.1200
identifying text 1.1400

そして、これを(たとえば1.15を追加して)次のように変換したいと思います

identifying text 2.2700
identifying text 2.2900

通常、これは Python で行いますが、Windows マシンではあまり多くのものをインストールできません。私はVimを持っています:)

4

6 に答える 6

18

これがhobbsのソリューションの簡略化と修正です。

:%s/identifying text \zs\d\+\(.\d\+\)\=/\=(1.15+str2float(submatch(0)))/

のおかげで\zs、先頭のテキストを思い出す必要はありません。単一の加算のおかげstr2float()で、整数に対して実行されます(つまり、1.15 + 2.87は、3.102ではなく4.02の期待される結果をもたらします)。

もちろん、このソリューションには最新バージョンのVim(7.3?)が必要です。

于 2010-11-16T12:20:09.000 に答える
12

正規表現をキャプチャしてから、次のような vimscript 式を代わりに使用できます。

:%s/\(identifying text \)\(\d\+\)\.\(\d\+\)/
  \=submatch(1) . (submatch(2) + 1) . "." . (submatch(3) + 1500)

(改行なしのみ)。

于 2010-11-16T11:43:07.210 に答える
3

あなたの数値形式は固定されているように見えるので、intに変換して戻ってきて(ドットを削除して)11500を追加してドットを元に戻すのは簡単です。

:%s/\.//
:%normal11500^A " type C-V then C-a
:%s/....$/.&/

すべての行でそれを行いたくないが、「識別テキスト」に一致する行だけでそれを行う場合は、すべての % を「g/indentifying text/」に置き換えます。

于 2010-11-16T11:33:22.450 に答える
1

整数の場合は、n ^ Aを使用してnを数値に加算できます(n ^ Xを使用して数値を減算できます)。しかし、それが小数で機能するかどうかは疑問です。

于 2010-11-16T11:20:34.067 に答える
1

マクロの使用

qa .......................... start record macro 'a'
/iden<Enter> ................ search 'ident*' press Enter
2w .......................... jump 2 words until number one  (before dot)
Ctrl-a ...................... increases the number
2w .......................... jump to number after dot
1500 Ctrl-a ................. perform increases 1500 times
q ........................... stop record to macro 'a'

今作っているこのパターンで300行ある場合

300@a
于 2010-11-16T22:53:37.180 に答える
1

これはvimの解決策ではないかもしれませんが、awkが役立つと思います:

cat testscript | LC_ALL=C awk '{printf "%s %s %s %s %.3f\n", $1,$2,$3,$4,$5+1.567   }'

そしてテスト

this is a number 1.56
this is a number 2.56
this is a number 3.56

浮動小数点セパレータを正しく変換するには LC_ALL=C が必要でした。文字列の先頭/残りを出力するためのより洗練されたソリューションがあるかもしれません。結果は次のようになります。

this is a number 3.127
this is a number 4.127
this is a number 5.127
于 2010-11-16T12:01:46.000 に答える