2

我正在尝试从跟踪文件中提取特定行,如下所示:

- 0.118224 0 7 ack 40 ------- 1 2.0 7.0 0 2
r 0.118436 1 2 tcp 40 ------- 2 7.1 2.1 0 1
+ 0.118436 1 2 ack 40 ------- 2 3.1 2.1 0 3
- 0.118436 1 2 ack 40 ------- 2 4.1 2.1 0 3
r 0.120256 0 7 ack 40 ------- 1 2.0 7.0 0 2

我想提取任何具有以下内容的行:

r x.xxxxx 1 2 xxx xx ------- x numbers.x 2.x x x.

注意:x表示任何值,numbers可以在 3 到 7 之间。

这是我的尝试-它不起作用!:

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

有什么建议吗??

4

2 回答 2

0

你必须.\. 它在正则表达式中表示“任何字符”。

所以你的正则表达式可能看起来像:

if {[regexp {r \d\.\d{5} 1 2 \d{3} \d{2} ------- \d [3-7]\.\d 2\.\d \d \d} $line -> time ]} {
   # ...
}

现在你必须在()你想要的部分周围放置。

顺便说一句:我对您要匹配的内容的描述使用了以下转换:

set input {r x.xxxxx 1 2 xxx xx ------- x numbers.x 2.x x x}
set re [subst [regsub -all {x{2,}} $data {\\\\d{[string length \0]}}]]
set re [string map {. {\.} x {\d} numbers {[3-7]}} $re]
于 2013-04-19T16:39:56.107 回答
0

这是另一种方法:提取要用于比较的字段

while {[gets $f line] != -1} {
    lassign [split $line] a - b c - - - - d e - -
    if {
            $a eq "r"  && 
            $b == 1    && 
            $c == 2    && 
            3 <= floor($d) && floor($d) <= 7  && 
            floor($e) == 2
    } {
        puts $line
    }
}
于 2013-04-19T17:38:58.227 回答