Sed: как закомментировать строку в docker-compose.yml в - PullRequest
0 голосов
/ 01 октября 2019

Если у меня в файле есть следующие строки:

### 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

Результат будет:

### 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

Ответы [ 2 ]

0 голосов
/ 01 октября 2019

Это может работать для вас (GNU sed):

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

Если встречается строка, начинающаяся с redis:, установите переключатель в области удержания. Если встречается строка, начинающаяся ports:, проверьте пространство удержания, чтобы увидеть, установлен ли вышеуказанный переключатель (не пустой), и если это так, выключите переключатель (очистите пространство удержания), а затем замените первый пробел в каждой строке навсе порты с #.

0 голосов
/ 01 октября 2019

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 add #
  • , если f истинно, и строка содержит REDIS_PORT add # и установлен флаг f в ноль, чтобы другие ports не могли быть закомментированы.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...