Regex 在tcl中从输出中捕获关键字
我目前有一个脚本,可以登录到设备并运行命令。 命令的结果与此类似:Regex 在tcl中从输出中捕获关键字,regex,tcl,expect,Regex,Tcl,Expect,我目前有一个脚本,可以登录到设备并运行命令。 命令的结果与此类似: version: xxxx date of installation: yyyyy all other random stuff which takes up a whole lot of other lines 由于我在许多不同的设备(相同类型)上运行此功能,因此关键字版本和安装日期将始终相同。 我想捕获xxxx和yyyy的code>,根据设备的不同,它们会有所不同 可能性: 捕获整个输出并使用bash在version:之后
version: xxxx
date of installation: yyyyy
all other random stuff
which takes up a whole
lot of other lines
由于我在许多不同的设备(相同类型)上运行此功能,因此关键字版本
和安装日期
将始终相同。
我想捕获xxxx和yyyy的code>,根据设备的不同,它们会有所不同
可能性:
捕获整个输出并使用bash在version:之后或安装之后立即隔离单词:
使用tcl本身将version:和installation:之后的单词保存到文件中
我该如何做选项2?
我尝试浏览tcl的regexp,但没有找到解决方案
给出错误的修订代码:
foreach line [split $expect_out(buffer) "\n"] to set $line {
# if ([regexp {^version:} $line ] || [regexp {^date of } $line]){
regexp {^version: (.+)} $line fullmatch vsn
puts $fileId $vsn
regexp {^date of installation: (.+)} $line fullmatch install
puts $fileId $install
#}
}
我对if语句不太确定,所以我把它作废了。代码的其余部分仍然返回一个错误,表示vsn没有这样的变量。假设您正在逐行读取输出,比如在变量$line
中,您可以通过应用以下匹配来获取所需的数据:
regexp {^version: (.+)} $line fullmatch vsn
regexp {^date of installation: (.+)} $line fullmatch install
^
字符将匹配锚定到行首。在这两种情况下,整个匹配都存储在$fullmatch
中,但是您想要的部分(在括号中匹配)存储在第二个变量中(第一个匹配是$vsn
,第二个匹配是$install
)。我一直在寻找这个语法,非常感谢!这是有道理的,但我如何逐行读取输出,我将整个输出视为:expect\u output(buffer)在这种情况下,您可以设置一个循环,如foreach line[split$expect\u out(buffer)”\n“]
将$line
设置到数据的每一行,然后检查循环体中的正则表达式。@PeterLewerin不完全正确。如果使用该模式,您将需要额外的开关-lineanchor
。@user2883071在tclsh中,我为您的问题示例设置了一个变量lines
。然后我运行了foreach line[split$lines”\n'{if[regexp{^version:(.+)}$line fullmatch vsn]{puts$vsn}elseif[regexp{^date of installation:(.+)}$line fullmatch install]{puts$install}}
(在每个打开的大括号之后和每次调用之后都有新行),它工作正常,按预期打印xxxx和YYYY。