更改 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"。)
我需要将 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"。)