Команда Sed не обрабатывает символ кавычки должным образом - PullRequest
0 голосов
/ 15 января 2020

У меня небольшая проблема с командой sed. Итак, у меня есть Dockerfile, который содержит следующее:

LABEL maintainer="abc" \
    authors="abc" \
    version="1.0.0" \
    description="API desc..."

Я пытаюсь автоматизировать процесс выпуска, поэтому у меня есть сценарий, который увеличивает версию в Dockerfile перед его сборкой. Вот команда sed, которую я использую:

sed -r 's/(version=)([0-9])\.([0-9])\.([0-9])/echo "    \1\\\"\2.\3.$((\4+1))\\\" "/ge' Dockerfile

Результат таков:

LABEL maintainer="abc" \
    authors="abc" \
sh: 1: Syntax error: Unterminated quoted string

Но, насколько я вижу, все мои строки правильно указаны. Сам echo имеет как открывающий, так и закрывающий ", и внутри самой строки у меня есть оба \\\", чтобы напечатать сам символ ". Поэтому я не совсем понимаю, почему я получаю эту ошибку.

Я пробовал это

sed -r 's/(version=)([0-9])\.([0-9])\.([0-9])/echo "    \1\\\"\2.\3.$((\4+1))\\\" \""/ge' Dockerfile

Где я добавил \" до закрытия " echo: \ "" / ge ', и это на самом деле работает. Опять же, я не совсем понимаю, почему это будет работать, думал.

Спасибо за помощь

Ответы [ 2 ]

3 голосов
/ 15 января 2020

Не изменяйте Dockerfile. Сценарий, который создает ваше изображение, должен передать новую версию в качестве аргумента.

ARG version

LABEL maintainer="abc" \
      authors="abc" \
      version=$version \
      description="API desc..."

Тогда

docker build --build-arg version=<newversion> .

Независимо от того, какие вызовы docker build отвечают за создание следующего номера версии из старой один, который должен храниться где-то вне файла Docker.

Это может быть так же просто, как один файл, содержащий номер вашей версии, измененный с помощью awk:

$ cat version
1.2.3
$ awk -v OFS=. -F . '{$3=$3+1; print}' version > new_version && mv new_version version
$ cat version
1.2.4
0 голосов
/ 15 января 2020

Вам не хватает некоторых кавычек:

sed -r 's/(version=)\"([0-9])\.([0-9])\.([0-9])\"/echo "    \1\\\"\2.\3.$((\4+1))\\\" "/ge' Dockerfile
                    ^^                         ^^

Какие выходы:

authors="abc" \
version="1.0.1"
description="API desc..."
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...