如何使用TCL在多个文本中查找最新版本与上一版本的对应行
Tcl版本提取实现方案
核心逻辑
不用额外记录行号,逐行读取文件时始终缓存上一行的内容,当匹配到无前缀的最新version行时,此时缓存的上一行就是对应的最近历史版本,直接提取即可,逻辑简单且效率很高。
完整可运行代码
# 提前打开输出文件,避免循环内反复打开浪费IO性能,w表示先清空原有内容再写入 set output_fp [open "tool_version" w] foreach fileName [glob /aaatools/N*/release/version] { set fp [open $fileName "r"] set last_line "" set current_version "" set prev_version "" while {[gets $fp data] >= 0} { # 先判断当前行是不是无前缀的最新版本行 if {[regexp {^version\s*=\s*(\d+)} $data -> current_version]} { # 匹配成功的话,上一行就是最近的历史版本,提取版本号 if {[regexp {^#version\s*=\s*(\d+)} $last_line -> prev_version]} { # 按要求拼接内容写入输出文件,格式可根据需要调整 puts $output_fp "$fileName $current_version $prev_version" } # 匹配到最新版本后可以直接跳出循环,不需要读后面的内容(如果有的话) break } # 没匹配到最新版本就更新上一行缓存 set last_line $data } close $fp } # 关闭输出文件句柄 close $output_fp
关键说明
- 正则
^version\s*=\s*(\d+):^匹配行首,\s*兼容等号两边可能存在的空格,分组(\d+)提取纯数字版本号,如果你版本号有字母可以改成([A-Za-z0-9_]+) - 如果你的文件里最新版本行不一定是最后一行,只需要把
break去掉,代码也能正常匹配所有最新版本行 - 如果存在没有历史版本的异常情况(比如第一行就是无前缀的version),可以自行加判断跳过避免空内容写入
内容的提问来源于stack exchange,提问作者tongtong
相关产品推荐
相关产品推荐

