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

如何使用sed移除含斜杠的字符串前缀?

问题分析与解决

你的错误主要来自两个方面:sed替换命令的语法不完整,以及命令替换的括号未闭合。

错误原因

  1. sed s命令语法缺失:sed的替换命令格式是s<分隔符>模式<分隔符>替换内容<分隔符>,你使用~作为分隔符,但所有尝试的命令都没有用~闭合表达式。比如你写的s~^$BUGFIX_PREFIX~/",最后只有/而没有结尾的~,sed会判定表达式不完整,抛出unmatched '~'错误。
  2. 命令替换括号未闭合:$(...)的结尾缺少闭合的),这也会导致整体语法错误。
  3. 冗余的多sed调用:两个前缀的处理可以合并为一个sed命令,无需分两次处理。

修正后的代码

分两步处理的版本

# 移除指定前缀,确保sed命令语法完整,命令替换括号闭合
export UNFIXED_ID=$(echo "${CI_MERGE_REQUEST_TITLE}" | sed -e "s~^$BUGFIX_PREFIX~~" -e "s~^$FEATURE_PREFIX~~")
# 提取Jira issue ID
export MERGE_REQUEST_JIRA_ID=$(echo "${UNFIXED_ID}" | sed -r "s/^([A-Za-z][A-Za-z0-9]+-[0-9]+).*/\1/")
echo "${MERGE_REQUEST_JIRA_ID}"

一步到位的简洁版本

直接合并前缀匹配和ID提取,减少管道调用:

export MERGE_REQUEST_JIRA_ID=$(echo "${CI_MERGE_REQUEST_TITLE}" | sed -r "s~^($BUGFIX_PREFIX|$FEATURE_PREFIX)?([A-Za-z][A-Za-z0-9]+-[0-9]+).*~\2~")
echo "${MERGE_REQUEST_JIRA_ID}"

额外注意事项

  • 变量引用时加上双引号(如"${CI_MERGE_REQUEST_TITLE}"),避免标题中包含空格或特殊字符时被shell拆分。
  • 使用-r参数启用扩展正则表达式,让括号分组和|或逻辑更易读。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 03:46:03