Python Shell или Bash: как уменьшить число в строке много раз в файле

В следующем коде я хочу уменьшить число после 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.

Как я могу это сделать?

Какой результат вы ожидаете от данных строк? Что вы пробовали и как это не удалось?

choroba 18.09.2018 22:40

Я только что отредактировал вопрос с ожидаемым результатом

Loudghiri Ahmed 18.09.2018 22:41

Вы, кажется, имеете в виду, что хотите уменьшить его? Взгляните на ввод-вывод файла Python и регулярные выражения.

Jacques de Hooge 18.09.2018 22:44
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
3
95
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Решение с 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 не завершало макрос.

Другие вопросы по теме