В следующем коде я хочу уменьшить число после Vec2(, которое равно 11 в первой строке ниже:
new Point([84], '[',{ x: 49.22, y: 33.75 }, 4.28, 13.5, [new Vec2(11, 2)]),
new Point([85], ']', { x: 53.5, y: 33.75 }, 4.28, 13.5, [new Vec2(12, 2)]),
new Point([87], '[', { x: 57.78, y: 33.75 }, 6.42, 13.5, [new Vec2(13, 2), new Vec2(14, 2)])
Ожидаемый результат:
new Point([84], '[',{ x: 49.22, y: 33.75 }, 4.28, 13.5, [new Vec2(10, 2)]),
new Point([85], ']', { x: 53.5, y: 33.75 }, 4.28, 13.5, [new Vec2(11, 2)]),
new Point([87], '[', { x: 57.78, y: 33.75 }, 6.42, 13.5, [new Vec2(12, 2), new Vec2(13, 2)])
У меня есть сотни строк, как указано выше, я хочу записать их в pythonshell или bash.
Как я могу это сделать?
Я только что отредактировал вопрос с ожидаемым результатом
Вы, кажется, имеете в виду, что хотите уменьшить его? Взгляните на ввод-вывод файла Python и регулярные выражения.






Решение с Python и регулярными выражениями:
import re
def replacer(match):
num = int(match.group(0))
return str(num - 1)
regex = re.compile(r'(?<=Vec2\()\d+')
with open('path/to/input.ext') as f:
content = f.read()
result = regex.sub(replacer, content)
with open('path/to/output.ext', 'w') as f:
f.write(result)
Регулярное выражение использует поиск назад, поэтому в результирующее совпадение включается только число (\d+).
Все совпадения в файле заменяются с помощью функции, которая преобразует совпадение в целое число, уменьшает его и преобразует обратно в строку.
Perl спешит на помощь!
perl -pe 's/Vec2\(\K([0-9]+)/$1-1/ge' -- file
\K заставляет механизм регулярных выражений «забыть» предыдущие символы, поэтому заменяется только подстрока, соответствующая следующему регулярному выражению./e оценивает замену как кодЧто ж, это очень примитивно, но для разового использования вы можете использовать vi. Создайте макрос с
:map t /Vec2(/^Mww^X
Нажмите кнопку Enter, чтобы завершить макрос. Затем просто нажмите t столько раз, сколько вам нужно. Или удерживайте кнопку t некоторое время. Просто имейте в виду, что он вернется наверх.
Примечание: ^M - это одиночный символ, который можно использовать в макросе с помощью Ctrl-V Enter. Для ^X вы можете просто нажать Ctrl-x, но вам понадобится Ctrl-V, чтобы нажатие клавиши Enter не завершало макрос.
Какой результат вы ожидаете от данных строк? Что вы пробовали и как это не удалось?