Вим поиск и замена, добавление константы - PullRequest
16 голосов
/ 16 ноября 2010

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

Например.

identifying text 1.1200
identifying text 1.1400

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

identifying text 2.2700
identifying text 2.2900

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

Ответы [ 6 ]

18 голосов
/ 16 ноября 2010

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

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

Благодаря \zs нет необходимости вспоминать начальный текст. Благодаря str2float() выполняется одно сложение для всего числа (другими словами, 1,15 + 2,87 даст ожидаемый результат 4,02, а не 3,102).

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

10 голосов
/ 16 ноября 2010

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

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

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

3 голосов
/ 16 ноября 2010

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

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

Если вы не хотите делать это на всех строках, а только на той, которая соответствует «идентифицирующему тексту», замените все% на «g / идентификационный текст /»

1 голос
/ 17 ноября 2010

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

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
1 голос
/ 16 ноября 2010

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

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

...