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

如何用sed贪婪匹配改进Bash字符串前缀提取函数?

解决Bash函数提取含最后连字符前缀的问题

使用sed实现贪婪匹配并处理无连字符情况

你可以调整sed的正则表达式,匹配最后一个连字符及其后续内容,替换为连字符本身;同时处理无连字符的场景,直接返回空。改造后的函数如下:

get_prefix_with_hyphen() {
    echo "$1" | sed '/-/!s/.*//; s/-[^-]*$/-/'
}

效果验证:

  • 输入a-long-string → 输出a-long-
  • 输入test → 输出空字符串
  • 输入single-hyphen → 输出single-
  • 输入ends-with-hyphen- → 输出ends-with-hyphen-

正则解释:

  1. /-/!s/.*//:如果输入字符串不包含连字符,直接将整行替换为空,满足无连字符时无输出的需求
  2. s/-[^-]*$/-/:匹配最后一个连字符(-)及其后面所有非连字符的内容([^-]*$),将这部分替换为单个连字符,从而保留最后一个连字符之前的全部内容。

纯Bash实现(无需外部工具)

如果追求更高效率,可以用Bash内置的参数展开功能,避免调用外部工具:

get_prefix_with_hyphen() {
    local str="$1"
    [[ "$str" == *-* ]] && echo "${str%-*}-" || echo ""
}

逻辑解释:

  • ${str%-*}:Bash的后缀匹配删除语法,会去掉字符串中最后一个连字符及其之后的所有内容
  • 拼接-后就得到包含最后一个连字符的前缀
  • [[ "$str" == *-* ]]判断字符串是否含连字符,不含则输出空,替代原有的if判断逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 11:01:07