在面料中使用正则表达式和sed时出现问题

问题描述 投票:1回答:1

我正在写一个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)“

任何帮助非常感谢。

python regex python-3.x sed fabric
1个回答
0
投票

我想我会自由地回答我自己的问题,因为我现在正在努力工作。该函数需要如下所示:

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?"
  • ALLOWED_HOSTS字面匹配字符ALLOWED_HOSTS(区分大小写)
  • \?从字面上匹配空格字符
  • ?量词 - 尽可能多次匹配0到1次
  • =字面上匹配等号
  • \?从字面上匹配空格字符
  • ?量词 - 匹配0到1次
  • \ [字面上匹配左方括号
  • 第一捕获组([^]] *)
  • 匹配列表[^]] *中不存在的单个字符,即不是右方括号的字符
  • *量词 - 在零和无限时间之间匹配,尽可能多次
  • 在表达式^]中,字面上匹配右方括号字符
  • \]字面上匹配右方括号字符

运行fabfile的输出(site_name = somedomain):

ALLOWED_HOSTS\ ?=\ ?\[([^]]*)\]
© www.soinside.com 2019 - 2024. All rights reserved.