在缺少空间时使用正则表达式提取值

时间:2017-09-08 19:28:22

标签: regex tcl extract

我正在尝试从下面的输出中提取文本和第三列。我的问题是有一行缺少空间。在这种情况下是否可以提取该值?

4086   process-working          841901      841901      1234        22
4297   procesor_stats_controller_fmm543182      543182      0           22
4028   ipv6_ma                  3063025     3063025     -55         78
4280   tty-verifyd              694043      694043      0           22

到目前为止,我的正则表达式如下:

 \d+\s+(\w+-?\w+)\s*\d+\s+\d+\s+(-?\d+)\s+\d+

谢谢

编辑:它实际上是设备中的一个错误,至少应该有一个空格,所以我只是让他们修复它然后重试。感谢您抽出宝贵时间回答这个问题:)

2 个答案:

答案 0 :(得分:2)

在这种情况下,我首先将该行拆分为字段

foreach line $lines {
    set fields [regexp -inline -all {\S+} $line]
    if {[llength $fields] == 6} {
        puts [lindex $fields 2]
    } else {
        # extract the digits at the end of this field
        regexp {\d+$} [lindex $fields 1] value
        puts $value
    }
}
841901
543182
3063025
694043

答案 1 :(得分:0)

问题在于\w\w相当于[a-zA-Z0-9_]。 因此,它也会与数字相匹配(因为空间不足)。

而不是\w,请使用[a-zA-Z_]。因此,这个正则表达式应该适合你:

\d+\s+([a-z]+-?[a-z]+)\s*(\d+)\s+\d+\s+\d+\s+\d+