如何在Bash中用正则表达式筛选已暂存的Objective-C/++文件
Git预提交钩子中grep无法匹配Objective-C文件的解决方案
问题出在grep的正则表达式解析上:默认情况下grep使用基础正则表达式(BRE),而你写的(h|m|mm)属于**扩展正则表达式(ERE)**语法,BRE会把括号()和竖线|当作普通字符处理,导致正则无法匹配目标文件。
问题重现
暂存文件列表:
MyProject/Classes/App/AppDelegate.m MyProject/Classes/Util/MPAnalytics.h MyProject/Classes/Util/MPAnalytics.m MyProject/Classes/Util/MPData.mm MyProject/build/iOS/MyClass/Configs/My_Project.xcconfig MyProject/stuff/some_file.json
你的脚本:
#!bin/bash declare objc_extensions="^.*\.(h|m|mm)$" git diff --cached --name-only --diff-filter=ACMR | grep "$objc_extensions"
单独执行git diff --cached --name-only --diff-filter=ACMR能输出所有暂存文件,但结合grep后无匹配结果。
解决方案
有两种可行的修复方式:
1. 启用扩展正则表达式模式(推荐)
给grep添加-E选项,让它支持ERE语法,原正则无需修改即可正常工作:
#!bin/bash declare objc_extensions="^.*\.(h|m|mm)$" git diff --cached --name-only --diff-filter=ACMR | grep -E "$objc_extensions"
2. 转义基础正则中的特殊字符
如果不想使用-E选项,需要将正则里的括号和竖线转义,让BRE正确识别这些特殊符号:
#!bin/bash declare objc_extensions="^.*\.\(h\|m\|mm\)$" git diff --cached --name-only --diff-filter=ACMR | grep "$objc_extensions"
可选优化
你可以简化正则表达式,用^.*\.(h|m{1,2})$替代原正则,同样能匹配.h、.m、.mm文件,写法更简洁。
内容的提问来源于stack exchange,提问作者h.and.h
相关产品推荐
相关产品推荐

