如何在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
相关产品推荐
相关产品推荐

