如何使用 TCL 正则表达式匹配文件的特定行中的单词



让我们考虑我有一个文件 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 正则表达式逐行second line 192.169.0.1匹配 Gw IP 地址。请任何人帮助我得到想法。提前致谢

读取并丢弃第一行。如果第 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

如果我正确理解了您要查找的内容,您希望第二行中的 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成语即使文件只有几兆字节,也能很好地工作。

最新更新