我正在尝试从跟踪文件中提取特定行,如下所示:
- 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]}
有什么建议吗?
答案 0 :(得分: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]
答案 1 :(得分: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
}
}