如何在匹配模式的行上切换注释?

时间:2014-08-25 09:37:52

标签: python django awk sed makefile

我正在开发一个Django项目,我已经创建了 makefile 任务来重置我的数据库设置( reset-db) 。

但是,由于我只想syncdb 核心应用程序,我需要能够切换对旧版应用程序行的评论。在syncdb之前评论并在之后取消评论(因此其他操作正常发生)。

默认状态

INSTALLED_APPS = (
    …
    'django_extensions',
    'core',
    'legacy' # @reset-db
)

目标状态

INSTALLED_APPS = (
    …
    'django_extensions',
    'core',
    # 'legacy' # @reset-db
)

Makefile reset-db

目前的任务是

reset-db:
    # cmd to comment line
    DJANGO_SETTINGS_MODULE=${SETTINGS} sudo -u postgres -H dropdb evrpa \
    && sudo -u postgres -H createdb evrpa -O elopez; \
    ./manage.py syncdb --noinput --database=default;
    # cmd to UNcomment line

那么sedawk命令是做什么的?

2 个答案:

答案 0 :(得分:1)

只需获取原始文件的副本,进行修改,使用,然后将其恢复:

mv ${SETTINGS_PY} ${SETTINGS_PY}.tmp &&
sed '/@reset-db/s/^/#/' ${SETTINGS_PY}.tmp > ${SETTINGS_PY} &&
./manage.py syncdb --noinput --database=default &&
mv ${SETTINGS_PY}.tmp ${SETTINGS_PY}

通过这种方式,您不必提供脚本来尝试将修改后的文件恢复为原始内容,因为您有要恢复的原始文件的副本。

我认为你有充分的理由不引用你的变量,所以我也没有引用它们。

我在每一行的末尾添加了&&,因为您总是希望在执行下一个命令之前测试上一个命令。如果在makefile中没有正确的语法,请根据需要进行更改。

答案 1 :(得分:0)

以下是我的表现

注释

awk '/@reset-db/{ $0="# " $0 } {print}' ${SETTINGS_PY} > ${SETTINGS_PY}.tmp
  1. 对于与模式/@reset-db/匹配的行,我使用#{ $0="# " $0 }添加前缀,以更新行内容。
  2. 然后我用{print}打印所有行。
  3. 取消注释

    awk '/^# .*@reset-db/{ $0=gensub(/^#(.*)/, "\\1", "", $0) } {print}' ${SETTINGS_PY} > ${SETTINGS_PY}.tmp
    
    1. 对于与模式/^# .*@reset-db/匹配的行,我使用#删除{ $0=gensub(/^#(.*)/, "\\1", "", $0) }来更新当前行内容。
    2. 然后我用{print}打印所有行。
    3. 完成任务

      注意:您需要使用其他$转义 makefile 脚本中的$例如 {{ 1}}→$0)。

      $$0