将 2 个文件与具有多个匹配项的 TCL 进行比较

compare 2 files with TCL with multiple matches

我的问题是基于这个:How to look for the difference between two large files in tcl? and this: Compare columns between 2 files using TCL条目。我想将 2 个文件与另一个文件进行比较。我无权访问 TCLLIB。这些解决方案的问题是,它无法识别重复行。示例:

文件 1

interface Vlan1
 description LAN
 shutdown
 ip address 172.16.1.1 255.255.255.0
interface Vlan2
 description LAN
 ip address 172.16.2.1 255.255.255.0
interface Vlan3
 description LAN
 shutdown
 ip address 172.16.3.1 255.255.255.0

文件 2

interface Vlan1
 description LAN
 ip address 172.16.1.1 255.255.255.0
interface Vlan2
 description LAN
 ip address 172.16.2.1 255.255.255.0
interface Vlan3
 description LAN
 shutdown
 ip address 172.16.3.1 255.255.255.0

所以这些解决方案只是逐行查看并查找例如关机条目。因此脚本不会提醒配置存在差异,因为行关闭确实存在于第二个文件中的某处。那么我该如何纠正呢?如果我能以某种方式动态识别 'block' 并将内容与第二个文件中的同一块进行比较。但我不知道如何完成这个。有人可以引导我走向正确的方向吗?

这里有一些技巧:我正在基于这些文件创建一个 DSL,以便它们可以 sourced 作为 Tcl 代码:

proc interface {name} {
    set ::current $name
}

proc description {args} {
    dict set ::interfaces $::current description $args
}

proc shutdown {} {
    dict set ::interfaces $::current shutdown true
}

proc ip {address args} {
    dict set ::interfaces $::current ip $args
}

proc handle {filename} {
    set ::interfaces [dict create]
    source $filename
    return $::interfaces
}

主要的问题是过度使用全局变量。

但我们可以做到:

% set file1_data [handle file1]
Vlan1 {description LAN shutdown true ip {172.16.1.1 255.255.255.0}} Vlan2 {description LAN ip {172.16.2.1 255.255.255.0}} Vlan3 {description LAN shutdown true ip {172.16.3.1 255.255.255.0}}

% set file2_data [handle file2]
Vlan1 {description LAN ip {172.16.1.1 255.255.255.0}} Vlan2 {description LAN ip {172.16.2.1 255.255.255.0}} Vlan3 {description LAN shutdown true ip {172.16.3.1 255.255.255.0}}

您可以按照自己喜欢的方式比较这两个词典。