假设我有一个文件ip.txt:
IP地址:192.168.0.100/24 GW:192.168.0.1
IP地址:192.169.0.100/24 GW:192.169.0.1
IP地址:192.170.0.100/24 GW:192.170.0.1
以上三行是ip.txt中的内容。从该文件我希望使用TCL regexp逐行second line
192.169.0.1
匹配Gw IP地址。请有人帮我理解。提前谢谢
答案 0 :(得分:0)
阅读并弃掉第一行。 如果第2行匹配则完成,否则终止。
set f [open $filename r]
if {[gets $f line] == -1} { return -code error "failed to read line 1" }
if {[gets $f line] == -1} { return -code error "failed to read line 2" }
if {![string match "*GW: 192.169.0.1*" $line]} { return -code error "failed to match" }
return
当然,也许它并不总是第2行,并且安排它关闭文件会很聪明,但上面是tcl中最简单的版本,它将满足提供的规范。打开的文件在进程退出时关闭。我们不需要正则表达式 - 字符串匹配会很好。可替换地:
set f [open $filename r]
set lineno 1
while {[gets $f line] != -1 && $lineno < 3} {
if {$lineno == 2 && [regexp {GW: 192.169.0.1} $line]} {
return 1
}
incr lineno
}
close $f
return 0
答案 1 :(得分:0)
如果我已经理解了您正在寻找的内容,您希望第二个行中的IP地址部分(特别是网关地址)与某些模式匹配?最简单的方法可能是在Tcl中解析整个文件,然后选择其中的值(因为如果你想要第二个值,你可能会想要第三个值)。
proc parseTheFile {filename} {
set f [open $filename]
set result {}
foreach line [split [read $f] "\n"] {
if {[regexp {IP Address: ([\d.]+)/(\d+) GW: ([\d.]+)} $line -> ip mask gw]} {
lappend result [list $ip $mask $gw]
}
}
close $f
return $result
}
set parsed [parseTheFile "the/file.txt"]
set secondGW [lindex $parsed 1 2]
### Alternatively:
# set secondLineInfo [lindex $parsed 1]
# set secondGW [lindex $secondLineInfo 2]
### Or even:
# lassign [lindex $parsed 1] secondIP secondMask secondGW
就像那样,你可以在文件中解析并随意浏览它,甚至可以多次传递来回,而不必保持文件打开或经常重读。 split \n
/ read
成语即使文件大小只有几兆字节也能正常运行。