更改 file.txt 中的 vlan 编号

Change a vlan number in file.txt

我需要将 vlan 编号 1 更改为 555,如下所示:

file.txt

SW1#sh interfaces status

Port      Name               Status       Vlan       Duplex  Speed Type
Fa0/1                        connected    trunk        full    100    10/100BaseTX
Fa0/2                        notconnect   1            auto   auto 10/100BaseTX
Fa0/3                        notconnect   1            auto   auto 10/100BaseTX
Fa0/4                        notconnect   1            auto   auto 10/100BaseTX
Fa0/5                        connected    1          a-full  a-100 10/100BaseTX
Fa0/6                        notconnect   1            auto   auto 10/100BaseTX
Fa0/7                        connected    1          a-half   a-10 10/100BaseTX
Fa0/8                        connected    1          a-full  a-100 10/100BaseTX
Fa0/9                        notconnect   1            auto   auto 10/100BaseTX
Fa0/10                       notconnect   1            auto   auto 10/100BaseTX
Fa0/11                       connected    1          a-full  a-100 10/100BaseTX
Fa0/12                       notconnect   1            auto   auto 10/100BaseTX
Fa0/13                       notconnect   1            auto   auto 10/100BaseTX
Fa0/14                       notconnect   1            auto   auto 10/100BaseTX
Fa0/15                       notconnect   1            auto   auto 10/100BaseTX
Fa0/16                       notconnect   1            auto   auto 10/100BaseTX
Fa0/17                       notconnect   1            auto   auto 10/100BaseTX
Fa0/18                       notconnect   1            auto   auto 10/100BaseTX
Fa0/19                       notconnect   1            auto   auto 10/100BaseTX
Fa0/20                       notconnect   1            auto   auto 10/100BaseTX
Fa0/21                       notconnect   1            auto   auto 10/100BaseTX
Fa0/22                       notconnect   1            auto   auto 10/100BaseTX
Fa0/23                       notconnect   1            auto   auto 10/100BaseTX
Fa0/24   TRUNK VOICE BRANCH  connected    100        a-full  a-100 10/100BaseTX
Gi0/1                        connected    trunk      a-full a-1000 10/100/1000BaseTX
Gi0/2                        notconnect   1            auto   auto Not Present

代码:

set f [open "file.txt" r]
  foreach a [split [read -nonewline $f] \n] {
    set 0 [lindex $a 0]
    set b [lsearch -inline -regexp $a "1"]

    if { [regexp {^F|^G|^P} [=12=]] && $b == "1"} {   
      puts "conf t"
      puts "interface [=12=]"
      puts "switchport access vlan 555"
    }
}


 Output:

 conf t
 interface Fa0/2
 switchport access vlan 555
 conf t
 interface Fa0/3
 switchport access vlan 555
 conf t
 interface Fa0/4
 switchport access vlan 555
 conf t
 interface Fa0/5
 switchport access vlan 555
 conf t
 interface Fa0/6
 switchport access vlan 555
 conf t
 interface Fa0/7
 switchport access vlan 555
 conf t
 interface Fa0/8
 switchport access vlan 555
 conf t
 interface Fa0/9
 switchport access vlan 555
 conf t
 interface Fa0/20
 switchport access vlan 555
 conf t
 interface Fa0/22
 switchport access vlan 555
 conf t
 interface Fa0/23
 switchport access vlan 555
 conf t
 interface Gi0/2
 switchport access vlan 555

如您所见,端口 Fa0/10 到 Fa0/19 和端口 Fa0/21 未配置。我尝试用其他东西改变lsearch,但直到现在我都失败了。

我期望的正确输出是我需要将 vlan 1 的所有端口更改为 vlan 555。我该怎么做?

谢谢。

问题是 lsearch -inline -regexp $a "1" 找到了任何一种含有 "one" 数字的字符串,例如 19。后来,当它与 $b == "1" 中的 1 进行比较时,这个变为 19 == 1,失败。

解决方案是通过使用几种可能的正则表达式之一将匹配限制为精确的字符串 1{\m1\M} 是一个,但 {\y1\y}{^1$}也有效。

请注意,这段代码仍然有些脆弱(例如,第一行的匹配只是巧合)。

if {[string match {[FGP]*} $a] && [string range $a 42 52] == 1} 可能会更好。

文档:if, lsearch, Syntax of Tcl regular expressions, string

(请参阅正则表达式语法文档中的 "Constraint escapes"。)