Поиск и замена 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]