You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Gitlab CI中sed命令执行异常排查:sed: unmatched '|'错误

问题原因与解决办法

核心原因

  1. 非GNU sed的语法兼容性问题:你的GitLab CI runner使用的是BSD sed(从sed --version输出可判断),它和本地Ubuntu用的GNU sed在-i参数语法上有差异。BSD sed要求-i必须指定备份文件后缀(哪怕不需要备份,也要写-i ''),如果直接用-i不带参数,它会把后续的s|...部分误判为备份后缀,导致命令解析混乱,触发unmatched '|'错误。

  2. Base64字符串含换行符:GitLab CI环境中的base64是BSD版本,默认会给编码结果按每76个字符添加换行符,这让KEY_B64变量里包含\n。sed处理时,换行符会被当成命令结束标记,剩余字符串被当作新命令,从而出现分隔符不匹配报错。你尝试的printf %s $VAR无效,是因为shell展开变量时换行符会被保留;另外BSD base64禁用换行的参数是-b 0,而非GNU版本的-w0,这也是之前尝试无效的原因。

解决步骤

1. 生成无换行的Base64令牌

替换生成命令为BSD base64支持的语法,确保输出无换行:

KEY_B64=$(echo -n <JWT_TOKEN> | base64 -b 0)

2. 适配BSD sed的-i参数

修改sed命令,给-i加上空备份后缀(表示不生成备份文件):

sed -i '' "s|{{PLACEHOLDER}}|${KEY_B64}|g" <path>

3. 验证变量完整性(可选)

若问题仍存在,可打印变量确认无特殊字符:

echo "$KEY_B64" | cat -A

该命令会显示所有不可见字符(如换行符),确保KEY_B64是单行的Base64字符串。

内容的提问来源于stack exchange,提问作者Don Draper

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 02:50:33