我有一个像这样的字符串/feature/abc-1245_branch_name
,我想从字符串中提取 abc-1245 并将其存储到另一个变量中。
我尝试使用 sed 但效果不佳。
答案1
使用awk
(取决于输入字符串的变化程度):
awk -F[_/] '{print $3}' <<<"$string"
如果您希望能够处理更复杂的目录结构,您可以首先使用基本名称
basename "$string" | awk -F_ '{print $1}'
存储在变量中使用命令替换
variable=$(awk -F[_/] '{print $3}' <<<"$string")
答案2
string=/feature/abc-1245_branch_name
different_variable=${string%%_*}
different_variable=${different_variable##*/}
printf '%s\n' "$different_variable"
这使用标准参数替换首先删除第一个下划线后面的位,然后删除最后一个斜杠之前的位。
${variable%%pattern}
删除最长的子串pattern
匹配结尾的$variable
。${variable##pattern}
删除最长的子串pattern
匹配开始的$variable
。
如果你知道_branch_name
实际情况是什么,
string=/feature/abc-1245_branch_name
different_variable=$( basename "$string" '_branch_name' )
printf '%s\n' "$different_variable"
这将字符串视为路径名(即使它可能不是实际的路径名),并用于basename
获取最后一个路径组件(即“文件名”)。该basename
实用程序还能够删除文件名后缀,因此我们使用它来删除已知的字符串_branch_name
。
答案3
由于还没有答案基于sed
您的要求;
$ string="/feature/abc-1245_branch_name"
$ sed -e 's/^.*\///; s/_.*$//' <<<"$string"
abc-1245
按照 @jesse_b 建议使用命令替换将结果放入变量中:
$ result=$(sed -e 's/^.*\///; s/_.*$//' <<<"$string")
$ echo $result
abc-1245
然而,除非你的字符串变得更复杂,解析和解析/过滤模式从一个字符串到另一个字符串改变,我会使用 @kusalananda 的纯 Bash 解决方案。它所做的事情与我在这里所做的完全相同sed
,即贪婪模式匹配,但在这个简单的情况下,纯 Bash 可能是“自然”的选择。
答案4
我尝试了 grep ,效果很好,而且非常简单。
$(echo "feature/ABC-BranchName" | grep -Eo 'develop|release|((feature|bugfix|hotfix)/ABC-)([0-9]+)' |tr '/' '-');