저는 여러 개의 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.
변수 앞에 추가됩니다 .