Intereting Posts
Как получить группу, к которой принадлежит пользователь в SCO Удалить строку, содержащую первое появление «pattern1» после последнего появления «pattern2»? Настройка ulimit `max open files` для демонтированного мастер-процесса nginx копировать только файлы для записи и чтения – linux В Red Hat, как установить систему python 3.6.1, когда 2.7.5 уже установлен? Кнопка добавления VPN отключена в Debian Wheezy / LXDE Получил «синтаксическую ошибку около неожиданного конца файла» в сценарии bash Windows 7 / Ubuntu 11 с двойной загрузкой плюс VM? Как сохранить только последний файл в папке и переместить старые файлы в папку «Архив» Восстановление sendmail на сервере приложений FreeBSD после добавления нового контроллера домена activedirectory в сеть Как я могу записать cd в каталог с правами root? Как while цикл выполняется в сценарии оболочки для условия FALSE? Что вызывает этот зеленый фон в ls-выходе? Как отключить сообщение «Последний неудачный вход в систему» ​​на Centos? Найдите владельца каталога или файла, но верните его только и ничего не сделайте

Как я могу добавить строки, которые не начинаются с определенных ключевых слов?

Я изменяю кучу файлов 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' или ^'import' или ^'parentClass' или ^[0-9] . Любое руководство будет очень полезным. Благодарю.

Этот маленький однострочный 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 

Предполагая, что строки, к которым вы хотите применить переменную prepend, всегда будут иметь указанную вами форму знака = , этот однострочный 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. к переменной.