Tcl读取多文件时如何将同一文件的正则匹配结果合并为单行输出
TCL多文件多关键词匹配合并输出解决方案
修改后可直接运行的代码
# 提前打开输出文件,避免每次匹配重复打开的额外开销 set fp2 [open output.txt "w"] foreach fileName [glob /home/kartik/tclprac/*/*] { # 初始化当前文件的匹配内容暂存变量 set match_content "" set fp [open $fileName "r"] while { [gets $fp data] >= 0 } { # 修正原代码的逻辑运算符和正则表达式规则 if {[regexp {^set Date.*} $data] || [regexp {^set Channel.*} $data] } { # 去除行尾多余换行后,将匹配内容追加到暂存变量 append match_content [string trim $data] " " } } close $fp # 当前文件存在匹配内容时,统一拼接输出 if {$match_content ne ""} { set file_dir [file dirname $fileName] set information "file: $file_dir data: $match_content" puts $information puts $fp2 $information } } close $fp2
关键修改说明
- 新增单文件匹配结果暂存逻辑:每个文件处理前初始化空的
match_content变量,匹配到内容仅追加到该变量,不会匹配一行就单独输出 - 调整输出时机:单个文件全部读取完成后,再统一拼接输出信息,保证同文件的所有匹配结果在同一行展示
- 优化IO操作:输出文件仅打开一次,所有内容处理完成后再关闭,大幅减少重复打开文件的性能开销
- 修正原代码错误:将按位或运算符
|改为逻辑或||,同时修正正则表达式的通配符写法,匹配规则更准确 - 新增资源释放逻辑:所有打开的文件指针处理完成后统一关闭,避免资源泄露
内容的提问来源于stack exchange,提问作者YashBundy
相关产品推荐
相关产品推荐

