Home > Enterprise >  sed fails with error "\1 not defined in the RE" when running in Gitlab CI
sed fails with error "\1 not defined in the RE" when running in Gitlab CI

Time:05-18

I am trying to update contents of a file from a variable with sed during Gitlab CI job. The variable comes from artifacts of the previous stage version. If simplified, my job looks something like this:

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

Unfortunatelly, the job fails with the following error message:

$ 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 coming from artifacts is the following:

$ echo "Pubspec version - $PUBSPEC_VERSION"
Pubspec version - 4.0.0 2

I am able to execute the command on my local Ubuntu (Linux) machine without any issues:

$ 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

The remote machine where Gitlab Runner is started is MacOS. Not sure whether it matters.

As you can see, I also use folding style in my CI configuration like proposed here in order to avoid inproper colon interpretation.

I googled for solutions to solve the issue but it seems that I don't need to escape (though I also tried) group parentheses in my regular expression because I use extended regular expression.

So I'm stuck on it...

P.S. I don't have access to the shell of remote MacOS.

CodePudding user response:

is MacOS.

-i takes a suffix argument, so -E is the backup suffix to create. Yuo would want:

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