如何添加不以某些关键字开头的行?

如何添加不以某些关键字开头的行?

我正在修改一堆 python 文件,我需要在每个变量声明前面加上“self.”。这是我正在尝试做的事情的一个例子。

由此:

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

        flag1               = 0  
        flag2               = 1    

        array =           (0,
                           1,
                           2)

对此:

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

        self.flag1               = 0  
        self.flag2               = 1    

        self.array =           (0,
                                1,
                                2)

我很熟悉,sed但我不确定如何在不匹配多个字符串/数字的行前面添加行。如果它与以下模式不匹配,则在前面添加行:^'def'or ^'import'or ^'parentClass'or ^[0-9]。任何指导都会非常有帮助。谢谢。

答案1

这个小小的 Perl 行将尝试限制对__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

或者,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

答案2

假设您想要应用变量前缀的行始终具有=您指定的符号形式,那么这一sed行应该可以工作。

$ 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*=\)/\1self\.\2\3/g' myfile.py 
class testClass(parentClass):
    def __init__(self):
        parentClass.__init__(self)

        self.flag1               = 0  
        self.flag2               = 1    

        self.array =           (0,
                           1,
                           2)

这个看起来可怕的正则表达式正在寻找以字母数字字符串开头的行(忽略空格),然后在等号之前有一些空格。它附加self.在变量之前。

相关内容