특정 키워드로 시작하지 않는 줄을 추가하는 방법은 무엇입니까?

특정 키워드로 시작하지 않는 줄을 추가하는 방법은 무엇입니까?

저는 여러 개의 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'또는 ^'parentClass'or 줄을 추가하세요 ^[0-9]. 어떤 지침이라도 매우 도움이 될 것입니다. 감사해요.

답변1

__init__이 작은 Perl 라인은 메소드 대체를 제한하려고 시도합니다.

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.변수 앞에 추가됩니다 .

관련 정보