Поиск и замена Vim, добавление константы

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

Eg.

identifying text 1.1200
identifying text 1.1400

и я хотел бы преобразовать это (добавив, например, 1.15) в

identifying text 2.2700
identifying text 2.2900

Обычно я делал это на Python, но это на машине Windows, где я не могу установить слишком много вещей. У меня есть Vim, хотя:)

Ответы

Ответ 1

Вот упрощение и исправление решения hobbs:

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

Благодаря \zs нет необходимости вспоминать ведущий текст. Благодаря str2float() выполняется одно дополнение на всем числе (другими словами, 1.15 + 2.87 даст ожидаемый результат, 4.02, а не 3.102).

Конечно, для этого решения требуется последняя версия Vim (7.3?)

Ответ 2

Вы можете сделать регулярное выражение для захвата, а затем использовать выражение vimscript в качестве замены, что-то вроде

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

(только без разрыва строки).

Ответ 3

Формат вашего номера кажется фиксированным, поэтому легко преобразовать в int и вернуться (удалить точку) добавить 11500 и поставить точку обратно.

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

Если вы не хотите делать это во всех строках, а только в том, что соответствует "идентификационному тексту", замените все% на "g/indentifying text/"

Ответ 4

Для целых чисел вы можете просто использовать n ^ A, чтобы добавить n к числу (и n ^ X, чтобы вычесть его). Я сомневаюсь, что это работает для дробных чисел.

Ответ 5

Ну, это может быть не решение для 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

Ответ 6

Использование макроса

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 строк с этим шаблоном, теперь создаем

[email protected]