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。