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

如何在Mac系统Bash中使用正则表达式提取指定部分字符串

Mac Bash环境下字符串提取问题解决

错误原因说明

  • Mac自带的为BSD版本sed,与Linux常用的GNU sed语法存在差异,默认未开启扩展正则表达式,|、{}等元字符未转义时无法被正确识别,匹配失败后sed不会执行替换,直接返回原字符串。
  • BSD sed不支持\d数字匹配语法,无法匹配目标数字段,导致替换失效。
  • 低版本BSD sed不支持I大小写不敏感标志,添加后会抛出语法错误。

无需额外安装软件的解决方案

区分大小写版本

使用-E参数开启BSD sed的扩展正则表达式,用[0-9]代替\d匹配数字,命令如下:

extractedValue=$(getInputString | sed -E 's/.*((def|foo|bar)-[0-9]{2,6}).*/\1/')

匹配效果符合预期:

  • 输入abc/def-1234-random-words → 输出def-1234
  • 输入bla/foo-12-random-words → 输出foo-12
  • 输入bar-12345-random-words → 输出bar-12345

大小写不敏感版本

如果需要匹配大小写混合的关键词(如DEF、Foo等),可以用字符类匹配关键词的大小写形式,命令如下:

extractedValue=$(getInputString | sed -E 's/.*(([Dd][Ee][Ff]|[Ff][Oo][Oo]|[Bb][Aa][Rr])-[0-9]{2,6}).*/\1/')

兼容GNU sed语法的解决方案

如果习惯使用GNU sed的语法(支持\d、I标志等),可以通过Homebrew安装GNU sed:

brew install gnu-sed

安装完成后使用gsed命令代替原生sed,即可使用GNU sed的全部特性,命令如下:

# 区分大小写版本
extractedValue=$(getInputString | gsed -E 's/.*((def|foo|bar)-\d{2,6}).*/\1/')
# 大小写不敏感版本
extractedValue=$(getInputString | gsed -E 's/.*((def|foo|bar)-\d{2,6}).*/\1/I')

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 08:30:00