【问题标题】:Sed: how to comment out string in docker-compose.yml inSed:如何在 docker-compose.yml 中注释掉字符串
【发布时间】:2019-10-01 07:08:11
【问题描述】:

如果我在文件中有以下几行:

### PostgreSQL ###########################################
    postgres:
      build: ./postgres
      volumes:
        - ${DATA_PATH_HOST}/postgres:/var/lib/postgresql/data
        - ${POSTGRES_ENTRYPOINT_INITDB}:/docker-entrypoint-initdb.d
        ports:
        - "${POSTGRES_PORT}:5432"

### Redis ################################################
    redis:
      build: ./redis
      volumes:
        - ${DATA_PATH_HOST}/redis:/data
        ports:
        - "${REDIS_PORT}:6379"

我想注释掉redis的ports部分

结果是:

### PostgreSQL ###########################################
    postgres:
      build: ./postgres
      volumes:
        - ${DATA_PATH_HOST}/postgres:/var/lib/postgresql/data
        - ${POSTGRES_ENTRYPOINT_INITDB}:/docker-entrypoint-initdb.d
        ports:
        - "${POSTGRES_PORT}:5432"

### Redis ################################################
    redis:
      build: ./redis
      volumes:
        - ${DATA_PATH_HOST}/redis:/data
#       ports:
#        - "${REDIS_PORT}:6379"

这个正则表达式工作正常:

redis:\n.{0,200}([\s]ports:)

https://regex101.com/r/PBrUY7/4

但我不能通过 sed 替换

【问题讨论】:

    标签: regex sed docker-compose


    【解决方案1】:

    sed 可能不是执行此操作的最佳工具,请尝试awk

    awk '/redis:/ {f=1} f&&/ports/ {$0="#"$0} f&&/REDIS_PORT/ {$0="#"$0;f=0}1' file
    ### PostgreSQL ###########################################
        postgres:
          build: ./postgres
          volumes:
            - ${DATA_PATH_HOST}/postgres:/var/lib/postgresql/data
            - ${POSTGRES_ENTRYPOINT_INITDB}:/docker-entrypoint-initdb.d
            ports:
            - "${POSTGRES_PORT}:5432"
    
    ### Redis ################################################
        redis:
          build: ./redis
          volumes:
            - ${DATA_PATH_HOST}/redis:/data
    #        ports:
    #        - "${REDIS_PORT}:6379"
    
    • 如果行包含redis:,则将标志f 设置为1 (true)
    • 如果f 为真并且行包含ports 添加#
    • 如果f 为真并且行包含REDIS_PORT 添加# 并将标志f 设置为零以防止其他ports 被注释掉。

    【讨论】:

      【解决方案2】:

      这可能对你有用(GNU sed):

      sed '/^\s*redis:/h;/^\s*ports:/{x;/./{z;x;:a;s/^\s\?/#/;n;/^\s*- /ba;x};x}' file
      

      如果遇到以redis: 开头的行,请在保留空间中设置一个开关。如果遇到以ports: 开头的行,请检查保持空间以查看上面的开关是否设置为打开(非空),如果是则关闭开关(清空保持空间),然后将每行的第一个空格替换为所有带有# 的端口。

      【讨论】:

        猜你喜欢
        • 2014-09-13
        • 2013-08-02
        • 1970-01-01
        • 2018-07-18
        • 1970-01-01
        • 2014-06-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多