从字符串中提取文本并存储在变量中

从字符串中提取文本并存储在变量中

我有一个像这样的字符串/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 '/' '-');

相关内容