使用vim的常量中的多个数字

xor*_*xor 2 vim

我有这段文字:

(-1.000mm 1.000mm)
(-0.500mm 0.800mm)
(0.500mm 1.200mm)

(1.000mm 1.000mm)
(0.800mm 0.500mm)
(1.200mm -0.500mm)

(1.000mm -1.000mm)
(0.500mm -0.800mm)
(-0.500mm -1.200mm)

(-1.000mm -1.000mm)
(-0.800mm -0.500mm)
(-1.200mm 0.500mm)

(-1.000mm 1.000mm)
Run Code Online (Sandbox Code Playgroud)

我想将所有这些数字乘以0.95(以及其他数字).我尝试的是:

:%s/[0-9.]*mm/\=submatch(0)*0.95/g
Run Code Online (Sandbox Code Playgroud)

但结果是:

(-0.95 0.95)
(-0.0 0.0)
(0.0 0.95)

(0.95 0.95)
(0.0 0.0)
(0.95 -0.0)

(0.95 -0.95)
(0.0 -0.0)
(-0.0 -0.95)

(-0.95 -0.95)
(-0.0 -0.0)
(-0.95 0.0)

(-0.95 0.95)
Run Code Online (Sandbox Code Playgroud)

我必须对分组或其他东西做错事,因为除了大多数数字转向0.0之外,它mm还会消失.

L3v*_*han 5

问题是你的浮动字符串在乘法过程中被强制转换为整数,而不是浮点数.第二个问题是你更换mm:

:%s/[0-9.]*\zemm/\=str2float(submatch(0))*0.95/g
Run Code Online (Sandbox Code Playgroud)

该str2float函数将字符串转换为浮点数.该\zeregex的特殊序列"在任何位置相匹配,并将匹配的结束."

结果:

(-0.95mm 0.95mm)
(-0.475mm 0.76mm)
(0.475mm 1.14mm)

(0.95mm 0.95mm)
(0.76mm 0.475mm)
(1.14mm -0.475mm)

(0.95mm -0.95mm)
(0.475mm -0.76mm)
(-0.475mm -1.14mm)

(-0.95mm -0.95mm)
(-0.76mm -0.475mm)
(-1.14mm 0.475mm)

(-0.95mm 0.95mm)
Run Code Online (Sandbox Code Playgroud)