在Bash脚本中从提交消息指定位置提取根目录名称
提取提交消息中的根目录名称并赋值给Bash变量
问题分析
你需要从格式固定的提交消息中提取指定的根目录名称(可选值:CORE|SHARED|CSR|ADM|BUS)并赋值给变量,之前的尝试存在两个关键问题:
- 第一个sed命令错误:
sed -n '/CORE/'仅匹配包含CORE的行,但-n模式下没有添加打印动作(p),即便添加也只是输出整行,无法提取目标值。 - 变量赋值方式错误:
app='xxx' | sed...这种写法是直接将字符串赋值给app,管道后的sed没有输入来源,因此app最终为空。正确做法是用命令替换捕获sed的输出结果。
解决方案
方法1:使用sed提取(兼容多数环境)
通过精准正则匹配提取目标值,并用命令替换赋值给变量:
# 示例提交消息 commit_msg='GRP-0888 CHANGE CORE - (core/components/button) : Change button dimensions' # 提取根目录名称(宽松匹配大写单词) app=$(echo "$commit_msg" | sed -E 's/.*CHANGE ([A-Z]+) -.*/\1/') # 或者更严格匹配指定可选值,避免误匹配 app=$(echo "$commit_msg" | sed -E 's/.*CHANGE (CORE|SHARED|CSR|ADM|BUS) -.*/\1/') echo "$app" # 输出:CORE
方法2:Bash内置正则匹配(无需外部命令,更高效)
利用Bash的[[ ]]正则匹配特性,直接捕获目标值:
commit_msg='GRP-0876 CHANGE BUS - (pages/login) : Some message' if [[ $commit_msg =~ CHANGE (CORE|SHARED|CSR|ADM|BUS) - ]]; then app="${BASH_REMATCH[1]}" # BASH_REMATCH[1]对应第一个捕获组的内容 echo "$app" # 输出:BUS fi
内容的提问来源于stack exchange,提问作者Norayr Ghukasyan
相关产品推荐
相关产品推荐

