我正在修改一堆 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.
在变量之前。