Несколько поисковых терминов с командой поиска столбцов awk

Еще один быстрый способ, который избегает операторов 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."
2
10.08.2018, 09:55
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.к переменной.

0
27.01.2020, 22:31

Этот небольшой лайнер 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
0
27.01.2020, 22:31

Теги

Похожие вопросы