1 votes

Remplacer une section spécifique du code

Je ne sais pas ce qui pourrait faire ça, sed, vim, etc. Disons que j'ai 30 fonctions, pour rester simple, j'en montrerai 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

]

Ce petit exemple montre que j'ai créé mes fonctions comme je le souhaitais, elles sont similaires à la première fonction, j'ai donc fait un copier-coller, et j'ai changé leur nom et quelques paramètres. tout ce que je veux faire, c'est remplacer le 1 par le 2 dans la fonction AddTwo et remplacer le plus par la puissance dans la troisième fonction et le un par 2, et la troisième fonction également, et remplacer le 1 par 3.

En gros, j'ai un gros fichier, plein de fonctions, je veux éditer ces fonctions à la volée, pour leur faire faire ce que je veux qu'elles fassent.

Ce que je cherche, c'est un plugin pour un éditeur de texte, qui me permettrait de sélectionner un texte et d'utiliser l'outil de recherche et de remplacement sur cette fonction spécifique, tous les éditeurs ont des outils de recherche et de remplacement, mais ils recherchent dans le fichier entier, je veux rechercher la section de code que je sélectionne à l'aide de la souris.

2voto

Rmano Points 30303

Deux possibilités dans vim :

  1. rechercher et remplacer dans la sélection visuelle : choisir une sélection visuelle ( v à partir du mode normal), puis utiliser :

      :'<,'>s/1/3/g

    vous remarquerez que si vous appuyez sur " :" à partir du mode visuel, l'écran d'affichage s'affiche. :'<,'> apparaîtra automatiquement et vous n'aurez plus qu'à taper la commande de recherche et de remplacement ;

  2. (mon préféré) éditer dans vim, et quand on est sur un nombre en mode normal, CTRL-A l'incrémente, CTRL-X le décrémente --- c'est l'un des raccourcis les plus utiles de vim...

2voto

Jacob Vlijm Points 78990

Je ne sais pas si c'est ce que vous recherchez.

Sous un script avec with, vous pouvez changer le nom, le chiffre et l'opérateur des fonctions par leur index (0 = première fonction).

Dans l'en-tête du script, vous définissez une liste de tuples avec les paramètres souhaités, comme par exemple :

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

Vous pouvez choisir n'importe quel indice que vous souhaitez modifier. Si une ou plusieurs propriétés n'ont pas besoin d'être modifiées, laissez le tuple vide.

Exemple : changer uniquement le nom de la fonction d'indice 2 (la troisième fonction, puisque 0 = la première) :

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

Pour modifier les deux premières fonctions :

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

Maintien de différents ensembles de fonctions

Ce script pourrait être principalement utile si vous conservez différents ensembles de propriétés de fonctions en conservant différents changes = et de commenter toutes les lignes à l'exception de celle dont vous avez besoin actuellement, par exemple.

Comment l'utiliser ?

Copiez le script ci-dessous dans un fichier vide, définissez les paramètres souhaités pour les fonctions à modifier, le chemin d'accès au fichier, enregistrez-le sous script.py et exécutez-le :

python3 /path/to/script.py

Le script :

#!/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)

1voto

daveloyall Points 115

Emacs dispose d'une fonction qui pourrait vous être utile. Il s'agit du compteur de macros clavier.

Par exemple, si vous entrez la séquence suivante lors de la définition d'une macro 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 le texte "0112" est inséré dans la mémoire tampon, et pour la première et la deuxième exécution de la macro, "3445" et "6778" sont insérés.

Lire la suite la page EmacsWiki sur les compteurs de macros clavier .

Si vous n'avez jamais utilisé les macros clavier d'emacs pour effectuer des travaux de recherche/remplacement interactifs, vous voudrez également lire la partie principale de la rubrique page sur les macros clavier .

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X