Gitlab CI中sed命令执行异常排查:sed: unmatched '|'错误
问题原因与解决办法
核心原因
非GNU sed的语法兼容性问题:你的GitLab CI runner使用的是BSD sed(从
sed --version输出可判断),它和本地Ubuntu用的GNU sed在-i参数语法上有差异。BSD sed要求-i必须指定备份文件后缀(哪怕不需要备份,也要写-i ''),如果直接用-i不带参数,它会把后续的s|...部分误判为备份后缀,导致命令解析混乱,触发unmatched '|'错误。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
相关产品推荐
相关产品推荐

