Como posso adicionar linhas que não começam com determinadas palavras-chave?

2

Estou modificando um monte de arquivos python e preciso preceder todas as declarações de variáveis com 'self'. Aqui está um exemplo do que estou tentando fazer.

A partir disso:

class testClass(parentClass):
    def __init__(self):
        parentClass.__init__(self)

        flag1               = 0  
        flag2               = 1    

        array =           (0,
                           1,
                           2)

Para isso:

class testClass(parentClass):
    def __init__(self):
        parentClass.__init__(self)

        self.flag1               = 0  
        self.flag2               = 1    

        self.array =           (0,
                                1,
                                2)

Estou familiarizado com sed , mas não tenho certeza de como preceder linhas que não correspondem a várias strings / números. I.g. prefixar linha se ela não corresponder aos seguintes padrões: ^'def' ou ^'import' ou ^'parentClass' ou ^[0-9] . Qualquer orientação seria muito útil. Obrigado.

    
por John 09.08.2018 / 22:04

2 respostas

0

Este pequeno perl one-liner tentará restringir a substituição ao método __init__

perl -pe '
    if (/^\s* def \s+ __init__/x) {
        $start = 1;
    }
    elsif ($start) {
        s{ (\w+) (?=\s+=) }{self.$1}x;
        /^\s* (class | def) \b/x and $start = 0;
    }
' file.py

Ou a mesma lógica no awk

awk '
    $1 == "def" && $2 ~ /^__init__/ {start = 1; print; next}
    start && /^[[:blank:]]+[[:alnum:]_]+)[[:blank:]]*=/ {
        $0 = gensub(/[[:alnum:]_]+/, "self.\0", 1)
    }
    {print}
    $1 == "def" || $1 == "class" {start = 0}
' file.py
    
por 10.08.2018 / 00:02
0

Supondo que as linhas que você deseja aplicar à variável prepend sempre tenham o formulário de sinal = especificado, esse sed one-liner deve funcionar.

$ cat myfile.py 
class testClass(parentClass):
    def __init__(self):
        parentClass.__init__(self)

        flag1               = 0  
        flag2               = 1    

        array =           (0,
                           1,
                           2)
$ sed -e 's/\(^\s\+\)\(\w\+\)\(\s*=\)/self\./g' myfile.py 
class testClass(parentClass):
    def __init__(self):
        parentClass.__init__(self)

        self.flag1               = 0  
        self.flag2               = 1    

        self.array =           (0,
                           1,
                           2)

Essa expressão regular de aparência horrível está procurando por linhas que começam com uma cadeia alfanumérica (ignorando o espaço em branco) e, em seguida, tem alguns espaços antes de um sinal de igual. Ele pré-acrescenta self. à variável.

    
por 26.08.2018 / 03:02