многократные числа в тексте по константе с использованием vim - PullRequest
0 голосов
/ 02 мая 2018

У меня есть этот текст:

(-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)

Я бы хотел умножить все эти числа на 0,95 (и другие числа). Я попробовал:

:%s/[0-9.]*mm/\=submatch(0)*0.95/g

но результат:

(-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)

Я, должно быть, что-то делаю не так с группировкой или что-то в этом роде, потому что помимо большинства чисел, обращающихся к 0.0, mm исчезает.

1 Ответ

0 голосов
/ 02 мая 2018

Проблема в том, что ваши плавающие строки приводятся к целым числам во время умножения, а не с плавающей точкой. Вторая проблема заключается в том, что вы заменяете мм:

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

Функция str2float превращает строку в число с плавающей точкой. Специальная последовательность \ze regex "совпадает в любой позиции и устанавливает там конец матча."

Результат:

(-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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...