如何用Shell的grep命令在单行提取多个指定格式的参数?
用Shell的grep命令提取Objective-C方法参数名
这问题我刚好之前处理过,用grep结合正则表达式就能轻松搞定!针对你给出的Objective-C方法声明,我们可以分两种方式实现:
方法一:分步提取(兼容多数基础grep版本)
假设你把方法代码保存到了methods.txt文件中,内容如下:
- (id)initWithFrame:(CGRect)frame ; - (NSUInteger)hideAllHUDsForView:(UIView *)view animated:(BOOL)animated ; - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context ;
运行以下命令:
grep -Eo '\)[[:space:]]+[a-zA-Z0-9_]+' methods.txt | grep -Eo '[a-zA-Z0-9_]+'
命令解释:
- 第一个
grep -Eo:-E启用扩展正则表达式,让语法更简洁;-o只输出匹配到的部分,而不是整行;- 正则
\)[[:space:]]+[a-zA-Z0-9_]+匹配右括号) + 一个或多个空白字符 + 参数名(字母/数字/下划线),输出结果是类似) frame、) view的片段。
- 第二个
grep -Eo:从第一步的结果中提取纯参数名,过滤掉括号和空格。
方法二:一步到位(需支持Perl正则的grep版本)
如果你的grep支持Perl兼容正则(大部分Linux/macOS的grep都支持),可以用更简洁的命令:
grep -Po '\)\s+\K[a-zA-Z0-9_]+' methods.txt
命令解释:
-P启用Perl兼容正则;-o同样只输出匹配部分;- 正则
\)\s+\K[a-zA-Z0-9_]+中,\K是Perl正则的特殊语法,表示忽略前面匹配的内容,直接输出后面的参数名,一步到位得到结果。
直接处理管道输入
如果不想存文件,直接把代码通过管道传入grep:
echo "- (id)initWithFrame:(CGRect)frame ; - (NSUInteger)hideAllHUDsForView:(UIView *)view animated:(BOOL)animated ; - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context ;" | grep -Po '\)\s+\K[a-zA-Z0-9_]+'
两种方法最终都会输出你需要的参数名:
frame view animated keyPath object change context
内容的提问来源于stack exchange,提问作者mgfjx
相关产品推荐
相关产品推荐

