如何用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-
正则解释:
/-/!s/.*//:如果输入字符串不包含连字符,直接将整行替换为空,满足无连字符时无输出的需求s/-[^-]*$/-/:匹配最后一个连字符(-)及其后面所有非连字符的内容([^-]*$),将这部分替换为单个连字符,从而保留最后一个连字符之前的全部内容。
纯Bash实现(无需外部工具)
如果追求更高效率,可以用Bash内置的参数展开功能,避免调用外部工具:
get_prefix_with_hyphen() { local str="$1" [[ "$str" == *-* ]] && echo "${str%-*}-" || echo "" }
逻辑解释:
${str%-*}:Bash的后缀匹配删除语法,会去掉字符串中最后一个连字符及其之后的所有内容- 拼接
-后就得到包含最后一个连字符的前缀 [[ "$str" == *-* ]]判断字符串是否含连字符,不含则输出空,替代原有的if判断逻辑。
内容的提问来源于stack exchange,提问作者arthuston
相关产品推荐
相关产品推荐

