Заменить определенный раздел кода

Я не знаю, что можно сделать, sed, vim, что угодно. Допустим, у меня есть 30 функций, чтобы сохранить его простым, я покажу 3

    #first function 

    AddOne = [
 a+1==b, b+1==c
]

    # second function 

    AddTwo = [
 a+1==b, b+1==c

]

    # third function 

    MultiplyByTwo =  [
 a+1==b, b+1==c, c+1==d
]


    #Fourth Function

    MultiplyByThree [ 

a+1==b, b+1==c, c+1==d

]

Этот небольшой пример показывает, что я создал свои функции, так, как я хотел, они похожи на первая функция, поэтому я скопировал вставку и изменил их имя и несколько параметров. все, что я хочу сделать, это заменить 1 на 2 в функции AddTwo и заменить плюс на мощность третьей функции, а вторую на вторую и третью функцию, а также заменить 1 на 3. [ ! d1]

в принципе, у меня есть большой файл, полный функций, я хочу, чтобы изменить эти функции на лету, чтобы заставить их сделать то, что я хочу, чтобы они сделали

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

1
задан 8 October 2014 в 13:24

2 ответа

Не уверен, что это то, что вы ищете.

Ниже скрипта с вами вы можете изменить имя, цифру и оператор функций по их индексу (0 = первая функция).

В начале скрипта вы задаете список кортежей с требуемыми настройками, например:

[(index, ("NewName"), ("digit"), ("operator")), (index, ("NewName"), ("digit"), ("operator"))]

Вы можете выбрать любой индекс, который хотите изменить. Если вам нужно изменить одно или несколько свойств, оставьте кортеж пустым.

Пример: только изменить имя функции с индексом 2 (третья функция, так как 0 = первая) :

[(2, ("NewName"), (), ())]

Чтобы изменить первые две функции:

changes = [(0, ("FuncName1"), ("2"), ("+")), (1, ("FuncName2"), ("2"), ("**"))]

Сохранение различных наборов функций

Этот сценарий может быть в основном полезен, если вы держите различные наборы свойств функций, сохраняя разные строки changes = и комментируя все, за исключением того, который вам нужен в настоящее время.

Как использовать

Скопировать сценарий ниже в пустую файл, задайте нужные параметры для функций, путь к файлу, сохраните его как script.py и запустите его с помощью:

python3 /path/to/script.py

Сценарий:

#!/usr/bin/env python3

# function / name / digit / operator
# (example)
changes = [(0, ("Name1"), (), ()), (1, ("Name2"), ("2"), ("**"))]

subject_file = "/path/to/file_withfunctions"
operators = ["+", "-", "*"] # ** has been taken care of in the script, you can use it in the "changes" line

with open(subject_file) as sample:
    lines = [line for line in sample.readlines()]

def first_occurrence(index, string, lines):
    area = lines[index:]
    func_line = [[i, area[i]] for i in range(len(area))if string in area[i]][0]
    func_line[0] = func_line[0]+index
    return func_line

functiondata = [[[i, lines[i]],first_occurrence(i, "==", lines)] for i in range(len(lines)) if "[" in lines[i]]

for item in changes:
    subject = functiondata[item[0]]
    if len(item[1]) != 0: # name
        name = subject[0][1].split()[0]
        newname = item[1]
        lines[subject[0][0]] = lines[subject[0][0]].replace(name, newname)
    if len(item[2]) != 0: # digit
        or_line = subject[1][1]
        character = [ch for ch in or_line if ch.isdigit()][0]
        new_line = or_line.replace(character, item[2])
        lines[subject[1][0]] = new_line
    if len(item[3]) != 0: # operator
        or_line = new_line
        if "**" in or_line:
            new_line = or_line.replace("**", item[3])
        else:
            character = [ch for ch in operators if ch in or_line][0]
            lines[subject[1][0]] = new_line
            new_line = or_line.replace(character, item[3])
        lines[subject[1][0]] = new_line

with open(subject_file, "wt") as sample:
    for line in lines:
        sample.write(line)
2
ответ дан 24 May 2018 в 03:03

У Emacs есть средство, которое может вам пригодиться. Он называется Макро-счетчиком клавиатуры.

Например, если вы введете следующую последовательность при определении макроса C-x C-k C-i C-x C-k C-i C-u C-x C-k C-i C-x C-k C-i, текст «0112» будет вставлен в буфер, а для первого и второго выполнения вставляются макросы «3445» и «6778».

Подробнее о странице EmacsWiki о макросчетах клавиатуры.

Если вы никогда не использовали макросы emacs для выполнения интерактивной работы по поиску / замене, вы также захотите прочитать главная страница на странице EmacsWiki о Макросчетах клавиатуры .

1
ответ дан 24 May 2018 в 03:03

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

Похожие вопросы: