Python Shell или Bash: как уменьшить число в строке много раз в файле - PullRequest
0 голосов
/ 18 сентября 2018

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

У меня есть сотнистрок, как указано выше, я хочу написать в python shell или bash.

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

Ответы [ 3 ]

0 голосов
/ 18 сентября 2018

Perl для спасения!

perl -pe 's/Vec2\(\K([0-9]+)/$1-1/ge' -- file
  • \K заставляет механизм регулярных выражений "забыть" предшествующие символы, поэтому заменяется только подстрока, соответствующая следующему регулярному выражению
  • /e оценивает замену как код
0 голосов
/ 19 сентября 2018

Ну, это очень сырая нефть, но для разовой вы можете использовать vi.Создайте макрос с помощью

:map t /Vec2(/^Mww^X

Нажмите клавишу Enter, чтобы завершить макрос.Затем просто нажмите t столько раз, сколько вам нужно.Или удерживайте клавишу t некоторое время.Просто имейте в виду, что он будет возвращаться к началу.

Примечание: ^M - это один символ, который может входить в макрос с помощью Ctrl-V Enter.Для ^X вы можете просто нажать Ctrl-x, но вам нужен Ctrl-V, чтобы нажатие клавиши Enter не заканчивало макрос.

0 голосов
/ 18 сентября 2018

Решение с 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)

Регулярное выражение использует lookbehind, поэтому в результирующее совпадение включается только число (\d+).

Все совпадения в файлезаменяются с помощью функции, которая преобразует совпадение в целое число, уменьшает его и возвращает обратно в строку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...