tcl:使用Regex循环和提取

时间:2013-12-13 22:17:56

标签: regex tcl

我有大量数据,我想根据两个条件提取两种类型的数据。我写了一个tcl脚本来使用正则表达式(newbie to regex)提取数据。

我使用了以下条件,它可以正常工作并产生所需输出的一部分:

if [regexp {\+ ([0-9.]+) 1 2.*- } $line -> time ] {

我在脚本中的某个地方使用变量时间。上述条件产生以下o / p(这只是一个样本,因为文件很大):

+ 30.808352 1 2 tcp 40 ------- 30 6.7 2.30 81 2073
+ 30.808416 1 2 tcp 40 ------- 128 8.16 2.159 81 2069
+ 30.809513 1 2 tcp 40 ------- 156 12.19 2.187 1 2077
+ 30.809641 1 2 tcp 80 ------- 156 12.19 2.187 1 2078
+ 30.809878 1 2 tcp 40 ------- 151 7.18 2.182 41 2079
+ 30.813096 1 2 tcp 40 ------- 161 9.20 2.192 0 2083
+ 30.813352 1 2 tcp 40 ------- 157 13.19 2.188 1 2085
+ 30.81348 1 2 tcp 80 ------- 157 13.19 2.188 1 2086
+ 30.815362 1 2 tcp 40 ------- 148 12.18 2.179 41 2088
+ 30.815426 1 2 tcp 40 ------- 148 5.9 2.179 41 2089
+ 30.818096 1 2 tcp 40 ------- 162 10.20 2.193 0 2091
+ 30.818544 1 2 tcp 40 ------- 158 3.78 2.189 1 2093
+ 30.818672 1 2 tcp 80 ------- 158 14.19 2.189 1 2094
+ 30.820657 1 2 tcp 40 ------- 153 9.19 2.184 41 2096
+ 30.821579 1 2 tcp 40 ------- 154 10.19 2.185 41 2097

然后,在上面的if条件中,我想检查第9列:

//condition 1
if (9th between [3-6].*) ( such as 3.78,6.7, 5.9)

第二个条件是:

  //condition 2
if (9th between [7-14].*) ( such as 14.19,12.18,10.19, 9.19,.....)

我正在努力解决上述两个问题。我尝试了以下内容,但没有收到错误,但是没有发生匹配!!

condition 1:
if [regexp {\+ ([0-9.]+) 1 2.*-* ([3-9])\..*/ } $line ] {

我知道我正在重复主要if条件的一部分,因为我不知道如何跳过列!!!

condition 2:
 if [regexp {\+ ([0-9.]+) 1 2.*-* ([7-9]|1[0-4])\..*/} $line ] {

任何建议!!!

2 个答案:

答案 0 :(得分:2)

你为什么不分裂空间?使用更多行可以获得几乎相同的结果。它是可读的,人们可以更好地理解代码:

if [regexp {\+ ([0-9.]+) 1 2.*- } $line -> time] {
    set elements [split $line " "] ;# You can actually omit the " " in this case
    set 9th [lindex $elements 8]

    # Condition 1
    if {$9th >= 3 && $9th < 7} { do something }

    # Condition 2
    if {$9th >= 7 && $9th < 15} { do something }
}

答案 1 :(得分:0)

匹配7-14 \+ ([0-9.]+) 1 2.*- \d+\s(?:[7-9]|1[0-4]) Demo
匹配3-6 \+ ([0-9.]+) 1 2.*- \d+\s[3-6] Demo