Sed завершается с ошибкой «\1 не определено в RE» при работе в Gitlab CI

Я пытаюсь обновить содержимое файла из переменной с помощью 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.

Отвечает ли это на ваш вопрос? Редактирование на месте с помощью sed в OS X

Wiktor Stribiżew 17.05.2022 10:12

@WiktorStribiżew Этот вопрос связан, но не объясняет разницу между командами в MacOS и Linux.

ezze 17.05.2022 12:49
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
2
29
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

is MacOS.

-i принимает аргумент-суффикс, поэтому -E — это резервный суффикс для создания. Юо хотел бы:

- sed -i '' -E 's/...'

Отличный ответ. Предлагаем также проверить документацию: unix.com/man-page/osx/1/sed

Dudi Boy 17.05.2022 10:06

Спасибо, теперь это работает в MacOS, но не работает в Linux: sed: can't read s/^(version: )(.+)$/\14.0.0+2/g: No such file or directory. Должен ли я различать его вручную?

ezze 17.05.2022 10:22
Should I distinguish it manually? да, они разные.
KamilCuk 17.05.2022 12:38

Другие вопросы по теме