我正在写一个fabfile,我在更换时遇到了麻烦。我已经使用regex101进行了检查,它表明我的正则表达式有效(有和没有'扩展'开关)。但是,当我运行fabfile时,没有替代品。正则表达式是:
ALLOWED_HOSTS\ ?=\ ?\[([^]]+)\]
它应该匹配Django settings.py文件中的任何ALLOWED_HOSTS,从空定义到多线程。要匹配的最小文本是
ALLOWED_HOSTS = []
要匹配的多行文字可能如下所示:
ALLOWED_HOSTS = [
'django-stage.somedomain.com',
'django-deployment.somedomain.com',
'localhost',
]
换句话说,正则表达式应匹配包含'ALLOWED_HOSTS'的字符串,后跟0或1个空格,后跟等号'=',后跟0或1个空格,后跟前括号'[',后跟任意文本(包括换行符),后跟一个向后括号']'。但是,运行fabfile时,上面的行不会更改。 fabfile中的完整功能:
def _update_settings(source_folder, site_name):
settings_path = source_folder + '/appname/settings.py'
sed(settings_path, "DEBUG = True", "DEBUG = False")
sed(settings_path,
'ALLOWED_HOSTS\ ?=\ ?\[([^]]+)\]',
f'ALLOWED_HOSTS = ["{site_name}"]'
)
运行时,输出为:
[django-stage.somedomain.com]运行:sed -i.bak -r -e's / ALLOWED_HOSTS \?= \?[([^]] +)] / ALLOWED_HOSTS = [“django-stage.somedomain.com “] / g'”$(echo /srv/django-stage.somedomain.com/source/appname/settings.py)“
任何帮助非常感谢。
我想我会自由地回答我自己的问题,因为我现在正在努力工作。该函数需要如下所示:
def _update_settings(source_folder, site_name):
settings_path = source_folder + '/appname/settings.py'
sed(settings_path, "DEBUG = True", "DEBUG = False")
run(
"sed -e '1h;2,$H;$!d;g' -i.bak -re 's/"
+ "ALLOWED_HOSTS\ ?=\ ?\[([^]]*)\]/"
+ "ALLOWED_HOSTS = \[\"" + site_name + "\"\]/' "
+ settings_path
)
-e'1h; 2,$ H; $!d; g'的含义由qantxswpoi中的@antak解释。
开关:
-r:-r开关用于扩展正则表达式(也是-E或--regexp-extended)。
-e:分隔命令。
-i:就地替换。 i.bak表示原始文件备份到filename.bak。
至于正则表达式:
"How can I use sed to replace a multi-line string?"
运行fabfile的输出(site_name = somedomain):
ALLOWED_HOSTS\ ?=\ ?\[([^]]*)\]