正则表达式匹配输出,但不应匹配

时间:2019-03-26 12:30:23

标签: tcl regexp-replace

我的输出看起来像这样:

+------+--------------+---------+------------+-----------------------+
| id   | IP address   | status  | type       | created at            |
+------+--------------+---------+------------+-----------------------+
| sc-1 |              | running | r4.2       | Aug 21, 2017 08:09:44 |
| sc-2 | 164.54.39.30 | running | r4.2       | Aug 21, 2017 08:09:44 |
+------+--------------+---------+------------+-----------------------+

我需要检查sc-1和sc2是否为“ runnig”。

我对第一行的解决方法如下:

proc check_if_exist_in_output{lines    
String_to_Check} {
set err_msg ""
set Flag "False"
foreach line $lines { if { $line eq $String_to_Check} {
                    set Flag "True"
        return $Flag }}
if {$Flag == "False"} {return "Error"} 

现在这可以正常工作,但问题是,我可能在第一行中也有此IP,然后我的脚本不起作用。

所以我尝试使用REGEXP解决方案,我想从输出中提供一行,并检查它是否包含我要查找的行。

长话短说: 如果"| sc-2 | | running |" is part of line " | sc-2 | 164.54.39.30 | running | " 答案应该是正确的。

我的带有REXEXP的新程序如下:

proc check_if_exist_in_output_with_reg_exspression {lines Str} { 
            set Flag "False"
    foreach line $lines {if {[regexp "$line.*" $Str] == 1}{                         
                      set Flag "True"
                  return $Flag }}
    if {$Flag == "False"} {
    #FAil step
    "Retuen Error" 
    }
}

#calling the proc:
set lines [split $OutPut "\n"]
set expected_output "| sc-2 |              | running |"
set Result [check_if_exist_in_output_reg $lines $expected_output] 

但是上面的proc总是返回TRUE,不计量我发送的内容。   虽然我希望在该行不存在的情况下得到False。   我也希望将预期的结果发送为:

    set expected_output "| sc-2 |[regexp {(?:\d+\.){3}\d+}]| running |"

但是我不确定如何以正确的方式编写它。

3 个答案:

答案 0 :(得分:0)

如jasonmclose所建议(我不确定如何在此处标记)。 我将正则表达式更改为更简单的正则表达式。 proc像这样正常工作:

    proc check_if_exist_in_output_with_reg_exspression {lines String_to_Check} {
    set err_msg ""
    set Flag "False"
    foreach line $lines {  if {[regexp ^.*sc-2.*running.* $String_to_Check ]==1} {
                          set Flag "True"
                          return $Flag }}
    if {$Flag == "False"} {
    #Fail step
    return "Error"
    }
}

答案 1 :(得分:0)

这不是OP关于正确使用正则表达式的问题的答案,但是值得一提的是,没有正则表达式也可以解决整个问题。您可能要考虑某事。遵循以下原则:

set data {
+------+--------------+---------+------------+-----------------------+
| id   | IP address   | status  | type       | created at            |
+------+--------------+---------+------------+-----------------------+
| sc-1 |              | running | r4.2       | Aug 21, 2017 08:09:44 |
| sc-2 | 164.54.39.30 | running | r4.2       | Aug 21, 2017 08:09:44 |
+------+--------------+---------+------------+-----------------------+
}

set status [dict create]
foreach line [lrange [split [string trim $data] "\n"] 3 end-1] {
    set line [lmap el [split [string trim $line |] |] {string trim $el}]
    dict set status [lindex $line 0] [lindex $line 2]
}

puts [dict get $status "sc-2"]

答案 2 :(得分:0)

            set Output {+------+--------------+---------+------------+-----------------------+
            | id   | IP address   | status  | type       | created at            |
            +------+--------------+---------+------------+-----------------------+
            | sc-1 |              | running | r4.2       | Aug 21, 2017 08:09:44 |
            | sc-2 | 164.54.39.30 | running | r4.2       | Aug 21, 2017 08:09:44 |
            +------+--------------+---------+------------+-----------------------+};

            proc check_if_exist_in_output_reg {lines Str} { 
                        set Flag "False"
                        if {[regexp  -linestop $Str $lines a] ==1} { ; #-linestop for matching whithin a line, a for just storing match in a variable a
                            #puts $a
                            set Flag "True"
                            return $Flag 
                        } else {
                            return "Error"
                        }
            }

            #calling the proc:
            #set lines [split $Output "\n"] : not needed
            set expected_output {sc-1.*running} ; #brackets for literal substitution
            set Result [check_if_exist_in_output_reg $Output $expected_output] 
            puts $Result