Я пытаюсь обновить содержимое файла из переменной с помощью sed
во время задания Gitlab CI. Переменная происходит от артефактов предыдущего этапа version
. Если упростить, моя работа выглядит примерно так:
build-android-dev:
stage: build
dependencies:
- version
only:
- mybranch
before_script:
- PUBSPEC_VERSION = "`cat app-pubspec-version`"
- echo "Pubspec version - $PUBSPEC_VERSION"
script:
- >
sed -i -E "s/^(version: )(.+)$/\1${PUBSPEC_VERSION}/g" pubspec.yaml
- cat pubspec.yaml | grep version
interruptible: true
tags:
- macmini-flutter
К сожалению, задание завершается со следующим сообщением об ошибке:
$ sed -i -E "s/^(version: )(.+)$/\1${PUBSPEC_VERSION}/g" pubspec.yaml
sed: 1: "s/^(version: )(.+)$/\14 ...": \1 not defined in the RE
Cleaning up project directory and file based variables
00:00
ERROR: Job failed: exit status 1
PUBSPEC_VERSION
происходящее от артефактов следующее:
$ echo "Pubspec version - $PUBSPEC_VERSION"
Pubspec version - 4.0.0+2
Я могу выполнить команду на своем локальном компьютере с Ubuntu (Linux) без каких-либо проблем:
$ export PUBSPEC_VERSION=4.0.0+2
$ sed -i -E "s/^(version: )(.+)$/\1${PUBSPEC_VERSION}/g" pubspec.yaml
$ cat pubspec.yaml | grep version
version: 4.0.0+2
Удаленная машина, на которой запускается Gitlab Runner, — MacOS. Не уверен, имеет ли это значение.
Как видите, я также использую стиль складывания в моей конфигурации CI, такой как предложено здесь, чтобы избежать неправильной интерпретации двоеточия.
Я погуглил решения, чтобы решить проблему, но кажется, что мне не нужно экранировать (хотя я тоже пытался) групповые скобки в моем регулярном выражении, потому что я использую расширенное регулярное выражение.
Так что я застрял на этом ...
P.S. У меня нет доступа к оболочке удаленной MacOS.
@WiktorStribiżew Этот вопрос связан, но не объясняет разницу между командами в MacOS и Linux.
is MacOS.
-i
принимает аргумент-суффикс, поэтому -E
— это резервный суффикс для создания. Юо хотел бы:
- sed -i '' -E 's/...'
Отличный ответ. Предлагаем также проверить документацию: unix.com/man-page/osx/1/sed
Спасибо, теперь это работает в MacOS, но не работает в Linux: sed: can't read s/^(version: )(.+)$/\14.0.0+2/g: No such file or directory
. Должен ли я различать его вручную?
Should I distinguish it manually?
да, они разные.
Отвечает ли это на ваш вопрос? Редактирование на месте с помощью sed в OS X