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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 19:40:04