如何在多个同后缀文件中匹配多个模式,确认所有模式均存在
多模式全局存在性校验方案
需求背景
需要在指定目录下所有后缀为.ext的文件中,校验多个目标字符串是否全部至少出现一次:所有模式均存在返回True,任意一个模式不存在返回False。匹配仅要求模式为行的子串即可,支持包含特殊字符的模式。
命令行高效实现
仅需一次文件扫描即可完成校验,性能远高于多次执行grep:
- 先将所有待匹配模式存入
patterns.txt,每行写一个模式,无需转义特殊字符 - 执行以下命令:
grep -rFof patterns.txt --include="*.ext" . | sort -u | wc -l
- 校验逻辑:如果命令输出的数值等于
patterns.txt中的模式总个数,说明所有模式都存在,返回True,否则返回False。
参数说明:
-r:递归搜索当前目录下的所有文件-F:将所有模式视为固定字符串,不解析正则语法,兼容带特殊字符的匹配需求-o:仅输出匹配到的模式内容,便于统计去重-f patterns.txt:从指定文件读取所有待匹配模式,无需手动拼接转义
Python原生实现(适配脚本集成需求)
无需调用外部命令,跨平台兼容性更好,支持提前终止搜索提升效率:
import os def check_all_patterns_exist(root_dir: str, ext_suffix: str, patterns: list[str]) -> bool: # 存储未匹配的模式,匹配到后直接移除 unmatched = set(patterns) if not unmatched: return True # 递归遍历目录 for root, _, files in os.walk(root_dir): for filename in files: if not filename.endswith(ext_suffix): continue file_path = os.path.join(root, filename) try: # 逐行读取避免大文件内存溢出 with open(file_path, 'r', encoding='utf-8', errors='ignore') as f: for line in f: matched_in_line = [p for p in unmatched if p in line] for p in matched_in_line: unmatched.remove(p) # 所有模式已匹配,提前终止 if not unmatched: return True except IOError: # 跳过无权限读取的文件,可按需调整异常处理逻辑 continue # 遍历完所有文件仍有未匹配的模式 return False # 调用示例 if __name__ == "__main__": # 填入你的待匹配模式 TARGET_PATTERNS = [ "pattern1", "pattern2", "Landroid/content/Intent;->hasExtra" ] result = check_all_patterns_exist(root_dir="./", ext_suffix=".ext", patterns=TARGET_PATTERNS) print(result)
内容的提问来源于stack exchange,提问作者lightBullet
相关产品推荐
相关产品推荐

