Еще один быстрый способ, который избегает операторов if, а также $?
, но довольно приятный и короткий (однотонный!), На мой взгляд, будет:
grep -q $name $file || echo "$name not found."
если вы хотите echo
if grep
возвращает 0
:
grep -q $name $file && echo "$name found."
и как if-else-statemet:
grep -q $name $file && echo "$name found." || echo "$name not found."
Предполагая, что строки, к которым вы хотите применить переменную, всегда имеют форму знака =
, указанную вами, этот 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.
к переменной.
Этот небольшой лайнер Perl One -попытается ограничить подстановку методом __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