当 Gitlab CI 中的 运行 时,sed 失败并出现错误“\1 not defined in the RE”

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

我正在尝试在 Gitlab CI 作业期间使用 sed 从变量更新文件的内容。该变量来自前一阶段的工件 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: )(.+)$/${PUBSPEC_VERSION}/g" pubspec.yaml
    - cat pubspec.yaml | grep version
  interruptible: true
  tags:
    - macmini-flutter

不幸的是,作业失败并显示以下错误消息:

$ sed -i -E "s/^(version: )(.+)$/${PUBSPEC_VERSION}/g" pubspec.yaml
sed: 1: "s/^(version: )(.+)$/ ...":  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: )(.+)$/${PUBSPEC_VERSION}/g" pubspec.yaml
$ cat pubspec.yaml | grep version
version: 4.0.0+2

启动Gitlab Runner的远程机器是MacOS。不确定是否重要。

如您所见,我也在 CI 配置中使用了折叠样式,例如 以避免不正确的冒号解释。

我用谷歌搜索 solutions 来解决这个问题,但似乎我不需要在我的正则表达式中转义(虽然我也试过)组括号,因为我使用扩展的正则表达式。

所以我坚持了下来...

P.S。我无法访问远程 MacOS 的 shell。

is MacOS.

-i 采用后缀参数,因此 -E 是要创建的备份后缀。您想要:

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